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

30/01/2018

Как сделать объекты AutoCAD аннотативными в .NET

В этой статье мы решим два вопроса:
  1. Как создать и добавить к чертежу новый масштаб аннотации?
  2. Как сделать примитивы аннотативными и присвоить им допустимые масштабы аннотаций?

Ниже приведен код, в котором содержатся два метода – команды:

Команда ADS позволит нам создать новый масштаб аннотации с именем "МойМасштаб 1:28", а команда ATS позволит сделать выбранный примитив аннотативным и назначить ему масштабы аннотаций:

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. namespace AnnotationScaling
  7. {
  8.   public class Commands
  9.   {
  10.     [CommandMethod("ADS")]
  11.     static public void addScale()
  12.     {
  13.       Document doc = Application.DocumentManager.MdiActiveDocument;
  14.       Database db = doc.Database;
  15.       Editor ed = doc.Editor;
  16.       try
  17.       {
  18.         ObjectContextManager ocm = db.ObjectContextManager;
  19.         if (ocm != null)
  20.         {
  21.           // Теперь получим коллекцию контекстов Масштабов Аннотаций
  22.           // (с именем ACDB_ANNOTATIONSCALES_COLLECTION)
  23.           ObjectContextCollection occ =
  24.             ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
  25.           if (occ != null)
  26.           {
  27.             // Создадим новый масштаб аннотаций
  28.             AnnotationScale asc = new AnnotationScale();
  29.             asc.Name = "МойМасштаб 1:28";
  30.             asc.PaperUnits = 1;
  31.             asc.DrawingUnits = 28;
  32.             // Добавляем его к коллекции контекстов
  33.             occ.AddContext(asc);
  34.           }
  35.         }
  36.       }
  37.       catch (System.Exception ex)
  38.       {
  39.         ed.WriteMessage(ex.ToString());
  40.       }
  41.     }
  42.  
  43.  
  44.     [CommandMethod("ATS")]
  45.     static public void attachScale()
  46.     {
  47.       Document doc = Application.DocumentManager.MdiActiveDocument;
  48.       Database db = doc.Database;
  49.       Editor ed = doc.Editor;
  50.       ObjectContextManager ocm = db.ObjectContextManager;
  51.  
  52.       ObjectContextCollection occ =
  53.         ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
  54.  
  55.       Transaction tr = doc.TransactionManager.StartTransaction();
  56.       using (tr)
  57.       {
  58.         PromptEntityOptions opts =
  59.           new PromptEntityOptions("\nВыберите примитив: ");
  60.         opts.SetRejectMessage(
  61.           "\nПримитив должен поддерживать аннотативное масштабирование."
  62.         );
  63.  
  64.         //////////////////////////////////////////////////////////////////////////
  65.         //        Классы примитивов поддерживающих аннотативность
  66.         //////////////////////////////////////////////////////////////////////////
  67.         opts.AddAllowedClass(typeof(DBText), false);
  68.         opts.AddAllowedClass(typeof(MText), false);
  69.         opts.AddAllowedClass(typeof(Dimension), false);
  70.         opts.AddAllowedClass(typeof(Leader), false);
  71.         opts.AddAllowedClass(typeof(Table), false);
  72.         opts.AddAllowedClass(typeof(Hatch), false);
  73.  
  74.         PromptEntityResult per = ed.GetEntity(opts);
  75.  
  76.         if (per.ObjectId != ObjectId.Null)
  77.         {
  78.           DBObject obj =  tr.GetObject(per.ObjectId, OpenMode.ForRead);
  79.  
  80.           if (obj != null)
  81.           {
  82.             obj.UpgradeOpen();
  83.             // Устанавливаем примитив аннотативным
  84.             obj.Annotative = AnnotativeStates.True;
  85.             // Добавляем допустимые масштабы аннотаций
  86.             // obj.AddContext(occ.GetContext("1:1"));
  87.             // obj.AddContext(occ.GetContext("1:2"));
  88.             // obj.AddContext(occ.GetContext("1:10"));
  89.             // Добавляем текущий масштаб
  90.             string cannoscale = Application.GetSystemVariable("CANNOSCALE") as string;
  91.             obj.AddContext(occ.GetContext(cannoscale));
  92.             ObjectContext oc = occ.GetContext("МойМасштаб 1:28");
  93.             if (oc != null)
  94.             {
  95.               obj.AddContext(oc);
  96.             }
  97.           }
  98.         }
  99.         tr.Commit();
  100.       }
  101.     }
  102.   }
  103. }

По мотивам: http://through-the-interface.typepad.com/through_the_interface/2007/04/making_autocad_.html

 

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

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

Опубликовано 30.01.2018
Отредактировано 30.01.2018 в 20:42:52