MultiCAD.NETでのカスタムプリミティブの選択と編集



前の記事で 、SDKのCustomObjectsの例に基づいて、MultiCAD.NET APIを使用してカスタムプリミティブを作成する方法について説明しました。 この記事では、カスタムオブジェクトの検索と選択の手順に注意を払い、その後の編集のためにMultiCAD.NETツールを使用して1つ以上のプリミティブを選択する機能を追加することにより、既存の例を拡張します。 詳細-カットの下。

そのため、カスタムプリミティブがあります。これは、内部にテキスト文字列を含む長方形のフレームです。 図面内のいくつかのオブジェクトを選択し、選択した各プリミティブのテキストを変更するタスクを見てみましょう。



図面内の単一のオブジェクトを選択するために、MultiCAD.NETはSelectObject()オブジェクトマネージャーメソッドを使用します。

public static McObjectId SelectObject(string sPromt); public static McObjectId SelectObject(string sPromt, ref Point3d pnt); 

両方のオプションを使用すると、ユーザーはオブジェクトを選択しながら、コマンドラインにプロンプ​​トを表示できます。 2番目の方法は、プロンプト行に加えて、パラメーター(クリックが行われたポイント)も含みます。

複数のオブジェクトを選択するには、 SelectObjects()メソッドを使用します。

 public static List SelectObjects(ObjectFilter filter); public static McObjectId[] SelectObjects(string sPromt); 

最初のオプションは、指定されたフィルターによって描画オブジェクトを選択するために使用され、2番目のオプションはコンソールにツールチップを表示し、ユーザーが自分でオブジェクトを選択できるようにします。

フィルターはObjectFilterクラスのオブジェクトですObjectFilterクラスは、オブジェクトを選択するための基準を決定します:ドキュメント、レイヤー、シート、その上で特定のタイプのオブジェクトが検索されます。 たとえば、次の例では、 SelectCirclesコマンドを使用して、現在のシート上にあり、指定された長方形領域と交差する「円」タイプのオブジェクトのリストを受け取ります。

 [CommandMethod("SelectCircles", CommandFlags.NoCheck | CommandFlags.NoPrefix)] static public void SelectCirclesCmd() { ObjectFilter filter = ObjectFilter.Create(true).AddType(DbCircle.TypeID); filter.Bound = new BoundBlock(Point3d.Origin, new Vector3d(10, 0, 0), new Vector3d(0, 10, 0), new Vector3d(0, 0, 10)); List<McObjectId> ids = filter.GetObjects(); } 


(現在のシートだけでなく)図面内のすべての円を選択するには、検索ドキュメントとして図面ドキュメントを追加します。

 ObjectFilter filter = ObjectFilter.Create(false).SetCurentDocument().AddType(DbCircle.TypeID); 


新しいTextInBoxEditコマンドを登録し、カスタム選択オブジェクトに機能を追加します。 次に、選択したオブジェクトのセット全体から、 TextInBoxタイプのユーザープリミティブのみを選択します。

 [CommandMethod("TextInBoxEdit", CommandFlags.NoCheck | CommandFlags.NoPrefix)] static public void TextInBoxEditCmd() { McObjectId[] idSelecteds = McObjectManager.SelectObjects("Select TextInBox primitives to edit"); McObjectId[] idSelectedTextinBox = Array.FindAll(idSelecteds, (s => (s.GetObject()) is TextInBox)); } 




少なくとも1つのプリミティブが選択された場合、それぞれに対してTextプロパティに新しい値を設定します。

 if (idSelectedTextinBox == null || idSelectedTextinBox.Length == 0) { MessageBox.Show("No TextInBox primitives selected!"); return; } foreach (McObjectId currID in idSelectedTextinBox) { (currID.GetObject() as TextInBox).Text = "Changed text"; } 


したがって、テキストは選択されたすべてのプリミティブで置き換えられます。



記事に関する議論は、フォーラム( forum.nanocad.ru/index.php?showtopic=6514)でも利用できます。

英語版の記事: MultiCAD.NETでのカスタムエンティティの選択と編集

Source: https://habr.com/ru/post/J200366/


All Articles