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

29/10/2018

Вставка формы (SHAPE) в чертеж AutoCAD при помощи .NET API

Вопрос: Как при помощи AutoCAD .NET API вставить в чертеж форму, как это делает команда ФОРМА (_SHAPE)?

Ответ: Как оказалось эта информация нигде не освещена. Для того чтобы вставить форму в чертеж необходимо:

  1. Создать текстовый стиль, указывающий на файл содержащий форму
  2. Создать примитив Shape, который имеет соответствующий стиль и имя соответствующее имени формы. Имеются определённые особенности, которые отражены в коде ниже:

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5.  
  6. // This line is not mandatory, but improves loading performances
  7. [assembly: CommandClass(typeof(InsertShape.MyCommands))]
  8.  
  9. namespace InsertShape
  10. {
  11.   public class MyCommands
  12.   {
  13.     [CommandMethod("InsertShape")]
  14.     public void MyCommand()
  15.     {
  16.       // Put your command code here
  17.       Document doc = Application.DocumentManager.MdiActiveDocument;
  18.       if (doc == null)
  19.         return;
  20.       Editor ed = doc.Editor;
  21.       Database db = doc.Database;
  22.       PromptStringOptions prStr =
  23.         new PromptStringOptions("\nИмя shx-файла: ");
  24.       prStr.AllowSpaces = true;
  25.       prStr.DefaultValue = "ltypeshp.shx";
  26.       PromptResult rsStr = ed.GetString(prStr);
  27.       if (rsStr.Status != PromptStatus.OK)
  28.         return;
  29.       string shxFilename = rsStr.StringResult;
  30.  
  31.       try
  32.       {
  33.         HostApplicationServices.Current
  34.           .FindFile(shxFilename, db, FindFileHint.FontFile);
  35.       } catch
  36.       {
  37.         ed.WriteMessage("\nshx-файл с таким именем не найден!");
  38.         return;
  39.       }
  40.  
  41.       prStr.DefaultValue = "BOX";
  42.       prStr.Message = "\nИмя формы: ";
  43.       rsStr = ed.GetString(prStr);
  44.       if (rsStr.Status != PromptStatus.OK)
  45.         return;
  46.       string shapeName = rsStr.StringResult;
  47.  
  48.       PromptPointResult rsPnt =
  49.         ed.GetPoint("\nТочка вставки: ");
  50.       if (rsPnt.Status != PromptStatus.OK)
  51.         return;
  52.  
  53.       using (Transaction tr = doc.TransactionManager.StartTransaction())
  54.       {
  55.         TextStyleTable tst = tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
  56.         // Проверяем нет ли еще подходящего текстового стиля с нужным файлом формы
  57.         // в таблице стилей
  58.         ObjectId styleId =
  59.           GetObjectIdOfTextStyleWithFileName(tst, shxFilename, tr);
  60.         // Если нет - создаём его и добавляем в базу
  61.         if (styleId.IsNull)
  62.         {
  63.           TextStyleTableRecord tstr = new TextStyleTableRecord();
  64.           tstr.IsShapeFile = true;
  65.           tstr.FileName = shxFilename;
  66.           styleId = tst.Add(tstr);
  67.           tr.AddNewlyCreatedDBObject(tstr, true);
  68.         }
  69.         // Создаём форму с единичным масштабом, нулевым углом
  70.         // поворота и единичным коэффициентом сжатия
  71.         Shape shape = new Shape(rsPnt.Value, 1.0, 0.0, 1.0);
  72.         shape.SetDatabaseDefaults(db);
  73.         shape.StyleId = styleId;
  74.         BlockTableRecord btr =
  75.           tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  76.         btr.AppendEntity(shape);
  77.         // Имя форме можно назначать только после её добавления в базу
  78.         shape.Name = shapeName;
  79.         tr.AddNewlyCreatedDBObject(shape, true);
  80.         tr.Commit();
  81.       }
  82.     }
  83.     /// <summary>
  84.     /// Функция позволяет найти текстовый стиль по строке пути к файлу форм
  85.     /// и вернуть его ObjectId или NULL если не нашелся
  86.     /// </summary>
  87.     /// <param name="tst">Таблица текстовых стилей</param>
  88.     /// <param name="shxFileName">имя файла форм</param>
  89.     /// <param name="tr">транзакция</param>
  90.     /// <returns></returns>
  91.     public static ObjectId GetObjectIdOfTextStyleWithFileName(TextStyleTable tst, string shxFileName, Transaction tr)
  92.     {
  93.       string FullShxFileName = HostApplicationServices.Current
  94.         .FindFile(shxFileName, tst.Database, FindFileHint.FontFile).ToLower();
  95.       foreach (ObjectId idtsr in tst)
  96.       {
  97.  
  98.         TextStyleTableRecord tstr =
  99.           tr.GetObject(idtsr, OpenMode.ForRead) as TextStyleTableRecord;
  100.         if (!tstr.IsShapeFile)
  101.           continue;
  102.         string filename = tstr.FileName.ToLower();
  103.         try {
  104.           filename = HostApplicationServices.Current
  105.                   .FindFile(filename, tst.Database, FindFileHint.FontFile).ToLower();
  106.         } catch { }
  107.  
  108.         if (FullShxFileName == filename)
  109.           return tstr.ObjectId;
  110.       }
  111.       return ObjectId.Null;
  112.     }
  113.   }
  114. }

 

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

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

Опубликовано 29.10.2018