Как получить коллекцию блоков по имени?

Автор Тема: Как получить коллекцию блоков по имени?  (Прочитано 8954 раз)

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

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Уважаемые форумчане, как, используя AC .NET API,  получить коллекцию блоков зная имя блока?

Начни с этих статей:
https://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
https://adn-cis.org/vyibor-vstavok-blokov-s-ispolzovaniem-filtra.html

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Luca,
Статьи помогли?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Статьи помогли?
надеюсь помогут. сегодня только начал ещё. вчера 14 часов работал и под конец уже мало что понимал. сегодня буду разбирать.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Уважаемые форумчане, как, используя AC .NET API,  получить коллекцию блоков зная имя блока?

Начни с этих статей:
https://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
https://adn-cis.org/vyibor-vstavok-blokov-s-ispolzovaniem-filtra.html
Может стоит копать в сторону OwnerID?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Может стоит копать в сторону OwnerID?
Уточни что ты имеешь в виду и как предлагаешь это реализовать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Может стоит копать в сторону OwnerID?
Уточни что ты имеешь в виду и как предлагаешь это реализовать.
Если я правильно понимаю, то автор хочет получить список ссылок блоков (BlockReference) в чертеже определённого описания блока, зная имя этого описания блока (BlockTableRecord). Я бы сначала получил бы все ссылки блоков в чертеже, например через SelectionSet, а потом бы через цикл сравнивал с именем OwnerID и добавлял в массив.

Так, меня особо не пинать, этот способ работал на AutoLisp, на .NET пока не было возможности попробовать этот способ на практике  :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Lemieux,
Идею понял. Только OwnerID с чьим ObjectId сравнивать будешь?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Lemieux,
Идею понял. Только OwnerID с чьим ObjectId сравнивать будешь?
BlockTableRecord. Судя по хелпу всё должно работать.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
BlockTableRecord. Судя по хелпу всё должно работать.
Ошибаешься. OwnerID для BlockReference вернет ObjectId той BlockTableRecord, куда этот BlockReference вставлен. Т.е. например, BlockTableRecord Пространства модели или Пространства листа, если вставлен в них или BlockTableRecord какого-нибудь блока, если это вложенный блок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
BlockTableRecord. Судя по хелпу всё должно работать.
Ошибаешься. OwnerID для BlockReference вернет ObjectId той BlockTableRecord, куда этот BlockReference вставлен. Т.е. например, BlockTableRecord Пространства модели или Пространства листа, если вставлен в них или BlockTableRecord какого-нибудь блока, если это вложенный блок.
Это фиаско ©  ;D

Через это свойство нужно получать ObjectID BlockTableRecord? https://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-Autodesk_AutoCAD_DatabaseServices_BlockReference_BlockTableRecord

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Через это свойство нужно получать ObjectID BlockTableRecord? https://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-Autodesk_AutoCAD_DatabaseServices_BlockReference_BlockTableRecord
Да - если это блок статический (не динамический) или нужно получить BlockTableRecord именно этой вставки. Если нужно получить BlockTableRecord основного описания динамического блока, то свойство DynamicBlockTableRecord: https://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-Autodesk_AutoCAD_DatabaseServices_BlockReference_DynamicBlockTableRecord
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Luca,
Статьи помогли?
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices; // Application
  2. using Autodesk.AutoCAD.DatabaseServices; // Database
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD;
  5. using Autodesk.AutoCAD.Runtime;
  6. // types
  7. using Transaction = Autodesk.AutoCAD.DatabaseServices.Transaction;
  8. using Database = Autodesk.AutoCAD.DatabaseServices.Database;
  9.  
  10. namespace Automation{
  11.     public class AFS
  12.     {
  13.        
  14.         [CommandMethod("getAllBlockByName")]
  15.         public void getAllBlocksByName()
  16.         {
  17.             Document document = Application.DocumentManager.MdiActiveDocument;
  18.             Editor   editor   = Application.DocumentManager.MdiActiveDocument.Editor;
  19.             Database database = document.Database;
  20.             try
  21.             {
  22.                 using (document.LockDocument())
  23.                 {
  24.                     using (Transaction transaction = database.TransactionManager.StartTransaction())
  25.                     {
  26.                         BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
  27.                         foreach (ObjectId blockId in blockTable)
  28.                         {
  29.                             BlockTableRecord blockTableRecord = (BlockTableRecord)transaction.GetObject(blockId, OpenMode.ForRead);
  30.                             /* В таблице
  31.                              * как здесь проверить, что это именно тот блок? методах
  32.                              *
  33.                             if ()
  34.                             {
  35.  
  36.                             }
  37.                             */
  38.                         }
  39.                     }
  40.  
  41.                 }
  42.             }
  43.             catch (Exception exc)
  44.             {
  45.                 editor.WriteMessage("{0}\n", exc.Message);
  46.             }
  47.         }
  48.     }
  49. }
  50.  
Вопросов несколько:
1. Где посмотреть правила форматирования?
2. Правильно ли я понимаю, что
в BlockTable хранятся все  блоки, если можно так сказать, а в BlockTableRecord хранятся ссылки на конкретные экземпляры?
3. Как нужный мне блок отличить от ненужных?  здесь https://help.autodesk.com/view/OARX/2020/ENU/?guid=OARX-ManagedRefGuide-__MEMBERTYPE_Properties_Autodesk_AutoCAD_DatabaseServices_BlockTableRecord я не увидел такого... Имя же должно быть у блока?
« Последнее редактирование: 04-11-2019, 15:06:42 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Где посмотреть правила форматирования?
У меня в подписи. А также в Правилах форума - п. 4.5
2. Правильно ли я понимаю, что
в BlockTable хранятся все  блоки, если можно так сказать, а в BlockTableRecord хранятся ссылки на конкретные экземпляры?
BlockTable - это таблица описаний всех блоков, а BlockTableRecord - это описание конкретного блока.
3. Как нужный мне блок отличить от ненужных?  здесь https://help.autodesk.com/view/OARX/2020/ENU/?guid=OARX-ManagedRefGuide-__MEMBERTYPE_Properties_Autodesk_AutoCAD_DatabaseServices_BlockTableRecord я не увидел такого... Имя же должно быть у блока?
Ты не обратил внимание, что класс BlockTableRecord - наследник класса SymbolTableRecord, у которого есть свойство Name: https://help.autodesk.com/view/OARX/2020/ENU/?guid=OARX-ManagedRefGuide-Autodesk_AutoCAD_DatabaseServices_SymbolTableRecord_Name
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Владимир Шу,
Я как раз эту ссылку и давал. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение