Получить все объекты, входящие в блокРабота с AutoCad как с COM объектом

Автор Тема: Получить все объекты, входящие в блокРабота с AutoCad как с COM объектом  (Прочитано 3171 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Теперь мне нужно получить все объекты, которые входят в блок. В варианте для API я использовал для этого Block table record BlockReference.
Здесь, как я понимаю, нужно получить объект аналогичный ModelSpace с помощью BlockReference. Я посмотрел все методы и свойства объекта
BlockReference и не нашел то, что мне нужно. Буду благодарен за любые идеи.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Теперь мне нужно получить все объекты, которые входят в блок.
Это я понимаю.
В варианте для API я использовал для этого Block table record BlockReference.
Здесь, как я понимаю, нужно получить объект аналогичный ModelSpace с помощью BlockReference.
Это я не понимаю. Поэтому я отвечу на первый вопрос. Причем в отдельной теме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Борис_С 21-03-2021, 12:31:51

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Если в твоем коде acDoc - это AcadDocument, то acDoc.Blocks - это коллекция блоков. Находишь в ней по имени нужный тебе блок (если ты опираешься на BlockReference, то имя блока BlockReference.Name). А дальше цикл по ней так же, как ты делал по acDoc.ModelSpace
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Гениально. Большое спасибо. Теперь все работает. На всякий случай привожу код выборки всех текстов текущего чертежа. Может быть кому-нибудь пригодится.
Код - C# [Выбрать]
  1. namespace PackageNormaAuditApp
  2. {
  3.     public class DwgParser
  4.     {
  5.         public enum DataType
  6.         {
  7.            DBText,                 // однострочный текст
  8.            MText,                   // многострочный текст
  9.            Table,                    // таблица
  10.            MLeader,                // мультивыноска
  11.            AttributeReference  // атрибуты блока
  12.         };
  13.  
  14.         public class CFragment // фрагмент текста текущего документа
  15.         {
  16.             public string text;
  17.             public DataType dt;
  18.             public CFragment(
  19.                  string text,
  20.                  DataType dt = DataType.Text)
  21.             {
  22.                 this.text = text;
  23.                 this.dt = dt;
  24.             }
  25.         }
  26.  
  27.         // Тексты элементов текущего документа
  28.         List<CFragment> ListTextItems = new List<CFragment>();
  29.  
  30.         public static bool OpenFile(string filePath)
  31.         {
  32.  
  33.             dynamic app = null;
  34.             dynamic acDoc = null;
  35.  
  36.             try
  37.             {
  38.                 Type comAppType = Type.GetTypeFromProgID("AutoCAD.Application");
  39.                 app = GetApp(() => Activator.CreateInstance(comAppType));
  40.  
  41.                 if (app == null)
  42.                 {
  43.                     WriteLine("Не удалось получить объект " + "Application." +
  44.                         "\n\nPress any key for exit...");
  45.                     ReadKey();
  46.                     return false;
  47.                 }
  48.                 //DoAction((object)app, () => app.Visible = false);
  49.  
  50.                 dynamic docs = CallFunc((object)app, () => app.Documents);
  51.  
  52.                 // Открываем документ
  53.                 acDoc = CallFunc((object)app, () => docs.Open(filePath));
  54.  
  55.                 ListTextItems.Clear();
  56.  
  57.                 dynamic modelSpace = CallFunc((object)app, () => acDoc.ModelSpace);
  58.  
  59.                 if (!FindTextsInDrawing(app, acDoc, modelSpace)) return false;
  60.  
  61.                 // закрытие без сохранения изменений
  62.                 DoAction((object)app, () => acDoc.Close(false));
  63.  
  64.                 DoAction((object)app, () => app.Quit());
  65.  
  66.                 return true;
  67.             }
  68.             catch (System.Exception)
  69.             {
  70.                 WriteErrorMsg(ex, ConsoleColor.Red);
  71.                 if (acDoc != null)
  72.                     DoAction((object)app, () => acDoc.Close(false));
  73.                 if (app != null)
  74.                     DoAction((object)app, () => app.Quit());
  75.                 return false;
  76.             };
  77.         }
  78.  
  79.         // Поиск всех текстов элементов чертежа
  80.         private bool FindTextsInDrawing(dynamic app, dynamic acDoc, dynamic modelSpace)
  81.         {
  82.             try
  83.             {
  84.                 dynamic count = CallFunc((object)app, () => modelSpace.Count);
  85.  
  86.                 for (int i = 0; i < (int)count; i++)
  87.                 {
  88.                     dynamic en = CallFunc((object)app, () => modelSpace.Item(i));
  89.                     dynamic className = CallFunc((object)app, () => en.ObjectName);
  90.                     if (className == "AcDbMText")
  91.                     {
  92.                         dynamic str = CallFunc((object)app, () => en.TextString);
  93.                         ListTextItems.Add(new CFragment(str, DataType.MText));
  94.                     }
  95.                     else if (className == "AcDbText")
  96.                     {
  97.                         dynamic str = CallFunc((object)app, () => en.TextString);
  98.                         ListTextItems.Add(new CFragment(str, DataType.DBText));
  99.                     }
  100.                     else if (className == "AcDbTable")
  101.                     {
  102.                         dynamic rowsCount = CallFunc((object)app, () => en.Rows);
  103.                         dynamic columnsCount = CallFunc((object)app, () => en.Columns);
  104.                         for (int row = 0; row < rowsCount; row++)
  105.                         for (int col = 0; col < columnsCount; col++)
  106.                         {
  107.                             dynamic str = CallFunc((object)app, () => en.GetCellValue(row, col));
  108.                             if (!String.IsNullOrEmpty(str))
  109.                             {
  110.                                ListTextItems.Add(new CFragment(str, DataType.Table));
  111.                             }
  112.                         }
  113.                     }
  114.                     else if (className == "AcDbMLeader")
  115.                     {
  116.                         dynamic str = CallFunc((object)app, () => en.TextString);
  117.                         ListTextItems.Add(new CFragment(str, DataType.MLeader));
  118.                     }
  119.                     else if (className == "AcDbBlockReference")
  120.                     {
  121.                         dynamic blockHasAttributes = CallFunc((object)app, () => en.HasAttributes);
  122.                         if (blockHasAttributes)
  123.                         {
  124.                             // Выборка текстов всех атрибутов текущего блока
  125.                             dynamic attributeCollection = CallFunc((object)app, () => en.GetAttributes());
  126.                             foreach (dynamic att in attributeCollection)
  127.                             {
  128.                                 dynamic bVisible = CallFunc((object)app, () => att.Visible);
  129.                                 if (bVisible)
  130.                                 {
  131.                                     dynamic str = CallFunc((object)app, () => att.TextString);
  132.                                     ListTextItems.Add(new CFragment(str, DataType.AttributeReference));
  133.                                 }
  134.                             }
  135.                         }
  136.                         dynamic blockReferenceName = CallFunc((object)app, () => en.Name);
  137.                         dynamic blocks = CallFunc((object)app, () => acDoc.Blocks);
  138.                         dynamic blocksCount = CallFunc((object)app, () => blocks.Count);
  139.                         for (int i1 = 0; i1 < (int)blocksCount; i1++)
  140.                         {
  141.                             dynamic block = CallFunc((object)app, () => blocks.Item(i1));
  142.                             dynamic blockName = CallFunc((object)app, () => block.Name);
  143.                             if (blockName == blockReferenceName)
  144.                             {
  145.                                 // Поиск текстов всех элементов, входящих в текущий блок
  146.                                 if (!FindTextsInDrawing(app, acDoc, block)) return false;
  147.                                 break;
  148.                             }
  149.                         }
  150.                     }
  151.                 }
  152.  
  153.                 return true;
  154.             }
  155.             catch (System.Exception)
  156.             {
  157.                 WriteErrorMsg(ex, ConsoleColor.Red);
  158.                 if (acDoc != null)
  159.                     DoAction((object)app, () => acDoc.Close(false));
  160.                 if (app != null)
  161.                     DoAction((object)app, () => app.Quit());
  162.                 return false;
  163.             };
  164.         }
  165.     }
  166. }
  167.  
В код нужно также подключить методы DoAction и CallFunc, разработанные Андреем Бушманом и описанные на странице https://adn-cis.org/forum/index.php?topic=7364.0