ADN Open CIS
Сообщество программистов Autodesk в СНГ

24/02/2016

Как показать диалоговое окно редактирования поля (Field) средствами .NET

Вы можете показать диалоговое окно AutoCAD редактирования поля, используя функцию “AcFdUiInvokeFieldDialog” из ObjectARX при помощи P/Invoke. При помощи этой функции можно показать диалог и вернуть объект поля, выбранный пользователем, переданный как первый параметр. Код ниже показывает как это сделать:

Код - C#: [Выделить]
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8.  
  9. [assembly: CommandClass(typeof(FieldDialog.Utils))]
  10.  
  11. namespace FieldDialog
  12. {
  13.   public class Utils
  14.   {
  15.     [DllImport("AcFdUi.arx", CallingConvention = CallingConvention.StdCall, EntryPoint = "AcFdUiInvokeFieldDialog")]
  16.     private static extern Int32 InvokeFieldDialog(ref IntPtr fd, Int32 bEdit, IntPtr pDb, IntPtr pParent);
  17.  
  18.     [CommandMethod("InsField", CommandFlags.Modal)]
  19.     public void InsField()
  20.     {
  21.       Document doc = Application.DocumentManager.MdiActiveDocument;
  22.       if (doc == null) return;
  23.       Database db = doc.Database;
  24.       Editor ed = doc.Editor;
  25.  
  26.       PromptPointResult ppr =
  27.         ed.GetPoint("\nУкажите точку вставки мультитекста: ");
  28.       if (ppr.Status != PromptStatus.OK) return;
  29.  
  30.       using (Field fd = new Field())
  31.       {
  32.         IntPtr ptr = fd.UnmanagedObject;
  33.         InvokeFieldDialog(ref ptr, 1, db.UnmanagedObject, IntPtr.Zero);
  34.         using (BlockTableRecord curSpace =
  35.           db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
  36.         {
  37.           using (MText mt = new MText())
  38.           {
  39.             mt.Location = ppr.Value;
  40.             curSpace.AppendEntity(mt);
  41.             mt.SetField("TEXT", fd);
  42.             fd.Evaluate((int)FieldEvaluationContext.Demand, db);
  43.           }
  44.         }
  45.       }
  46.     }
  47.   }
  48. }

 

Автор: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=4288

Опубликовано 24.02.2016
Отредактировано 26.02.2016 в 15:12:05