Найти все вставки динамического блока если имя блока на кирилице

Автор Тема: Найти все вставки динамического блока если имя блока на кирилице  (Прочитано 6459 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Здравствуйте, подскажите возможно ли найти все вставки динблоков по имени, если имя на кирилице или на кирилице и имеет пробелы в название? Нашел в сети пример скрипта от А. Ривилиса CalcBlock, CalcBlock1 но они не находит если имя на кирилице, можно ли находить в таком случае или требовать от пользователя чтобы имена блоков были на латинице и не имели пробелов? Я думаю с пробелом наверно не получится, даже если программно задавать имя блока или можно как то в кавычки засунуть  ?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Имена блоков прекрасно поддерживают как кириллицу, так и пробелы. В API тоже никаких проблем с этим нет - список вариантов динамического блока можно получить, список вставок блока ( BlockReference ) тоже. Так что проблема вымышленная.
Естественно для ввода имен удобней сделать маленькую форму, а не с консоли вводить. И лучше со списком всех имеющихся имен блоков.
И кстати, а чем не устраивает _SelectSimilar ?
« Последнее редактирование: 02-11-2020, 11:38:34 от avc »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Здравствуйте, подскажите возможно ли найти все вставки динблоков по имени, если имя на кирилице или на кирилице и имеет пробелы в название? Нашел в сети пример скрипта от А. Ривилиса CalcBlock, CalcBlock1 но они не находит если имя на кирилице, можно ли находить в таком случае или требовать от пользователя чтобы имена блоков были на латинице и не имели пробелов? Я думаю с пробелом наверно не получится, даже если программно задавать имя блока или можно как то в кавычки засунуть  ?
О каких это моих программах идёт речь? Не вижу ссылок и подтверждения, что что-то не работает.
Вот пример программы, которая должна работать: https://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Так что проблема вымышленная.
да мне нечего делать и я выдумал

каких это моих программах идёт речь? Не вижу ссылок и подтверждения, что что-то не работает.
Вот пример программы, которая должна работать: https://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html

https://forums.autodesk.com/t5/net/c-find-block-references-by-name/td-p/1672857

не работает с кирилицей и если содержит пробелы
« Последнее редактирование: 02-11-2020, 12:59:27 от Yusuf »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
https://forums.autodesk.com/t5/net/c-find-block-references-by-name/td-p/1672857

не работает с кирилицей и если содержит пробелы
Этот код вообще не работает с динамическими блоками, а не только с кирилицей или пробелами. Коду почти 15 лет и динамические блоки тогда только появились.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: Александр Ривилис от 02-11-2020, 10:54:24

    Так что проблема вымышленная.

да мне нечего делать и я выдумал
Это не моя цитата. Так что будь внимательнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
да мне нечего делать и я выдумал
Не выдумал, а сохранил в тайне код, который не работает.
Как я сразу и понял вы пытаетесь, ввести строку с пробелами через командную строку. Это возможно, но нужно включить опцию PromptStringOptions.AllowSpaces.
Ну и искать объекты в базе данных чертежа, а не селектом с фильтрами

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Это не моя цитата. Так что будь внимательнее.
извиняюсь не обратил внимания на это и спасибо за ссылку
Не выдумал, а сохранил в тайне код, который не работает.
Как я сразу и понял вы пытаетесь, ввести строку с пробелами через командную строку. Это возможно, но нужно включить опцию PromptStringOptions.AllowSpaces.
Ну и искать объекты в базе данных чертежа, а не селектом с фильтрами
Мне надо не во всей базе а только в модели, поэтому пользовался тем старым пользовался
« Последнее редактирование: 02-11-2020, 14:33:52 от Yusuf »

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Можно пользоваться тем кодом, который я дал в ссылке, только проверять значение OwnerId - если это ModelSpace, то берёшь, если нет - пропускаешь.
OwnerId  пытаюсь найти через дебаг, есть кажется только у anonymousBtr и он возвращает числа, как проверить их, лежит ли в модели

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Владелец есть у всех Entity, у все объектов вставляемых в чертеж. Вангую что вы пытаетесь найти OwnerId у BTR блока. Их там нет. BTR не вставляются в чертеж. Это только описание блока, но не Entity.  Надо взять все ссылки на блок (BlockReference) и уже смотреть куда они вставлены - в модель, на бумагу или в другие блоки.


Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Точно! У DBObject есть OwnerId, но это не то. Он у меня в коде один раз используется только у атрибутов. На пространство, куда вставлен Entity указывает именно   BlockId

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Точно! У DBObject есть OwnerId, но это не то. Он у меня в коде один раз используется только у атрибутов. На пространство, куда вставлен Entity указывает именно   BlockId
Для примитивов в блоке (в том числе в ModelSpace/PaperSpace) BlockId и OwnerId - это одно и тоже.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Для примитивов в блоке (в том числе в ModelSpace/PaperSpace) BlockId и OwnerId - это одно и тоже.
да оказывается одно и то же, только они же числа возращают и в дебаге не нашел есть все кроме Modelspace.

Нашел через ArxDBG что Modelspace есть в поле Block и  и MgdDbg  показывает что он в поле Name находится в SymbolTableRecord, а не в BlockTableRecord







p.s Прошу прошения что переспрашиваю, самому кажется что не реально туплю и не удобно все время спрашивать, вроде все разжевали а проглотить не могу, но хочется докапатся до истины.
p.p.s Кажется нашел решение сравниваю OwnerId блока с db.CurrentSpaceId, остается проверить по имени.
Вообще я на правильном пути или может можно по легче, суть в чем, пользователь выбирает один блок выходит окно с атрибутами этого блока, выбирает нужные атрибуты, нажимает Создать, потом по имени блока находим все блоки и нужные атрибуты и закидываем в эксель.

p.p.p.s Хотел проверить на совпадение имени блока и получил Model_Space оказывается у Entity.Blockname показывает где он лежит или я не прав?
« Последнее редактирование: 03-11-2020, 09:28:06 от Yusuf »

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
p.p.s Кажется нашел решение сравниваю OwnerId блока с db.CurrentSpaceId, остается проверить по имени.
CurrentSpaceId может быть как моделью, так и листом. Чтобы найти Id именно модели, есть разные способы. Мне лично больше всего нравится такой:
Код - C# [Выбрать]
  1. var mSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(database);
Сравнивать лучше всего не по имени, а как раз по Id. Если Entity.BlockId (или OwnerId) равен Id модели - значит, объект (примитив) находится в модели.
Хотел проверить на совпадение имени блока и получил Model_Space оказывается у Entity.Blockname показывает где он лежит или я не прав?
Да, у Entity есть такое свойство - BlockName. И имя блока модели можно получить с помощью SymbolUtilityServices.BlockModelSpaceName. И можно сравнивать BlockName у объекта с полученным названием блока модели. Но сравнение строк гораздо более медленнее, чем сравнение Id, которое сводится, по сути, к сравнению чисел.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Сравнивать лучше всего не по имени, а как раз по Id. Если Entity.BlockId (или OwnerId) равен Id модели - значит, объект (примитив) находится в модели.
спасибо так и буду делать
Разобрался уже или нет? Или нужно писать пример кода?
Да вроде разобрался, спасибо что Вы есть

Отмечено как Решение Yusuf 04-11-2020, 18:57:00

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Yusuf,
Вот вариант кода от Gilles Chanteau:
Код - C# [Выбрать]
  1. static IEnumerable<ObjectId> GetAllCurrentSpaceBlocksByName(string blockName)
  2. {
  3.     var db = HostApplicationServices.WorkingDatabase;
  4.     using (var tr = db.TransactionManager.StartOpenCloseTransaction())
  5.     {
  6.         var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  7.         return curSpace
  8.             .Cast<ObjectId>()
  9.             .Where(id => id.ObjectClass.DxfName == "INSERT")
  10.             .Select(id => (BlockReference)tr.GetObject(id, OpenMode.ForRead))
  11.             .Where(br => ((BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead)).Name == blockName)
  12.             .Select(br => br.ObjectId);
  13.     }
  14. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 4
Yusuf,
Вот вариант кода от Gilles Chanteau:
Код - C# [Выбрать]
  1. static IEnumerable<ObjectId> GetAllCurrentSpaceBlocksByName(string blockName)
  2. {
  3.     var db = HostApplicationServices.WorkingDatabase;
  4.     using (var tr = db.TransactionManager.StartOpenCloseTransaction())
  5.     {
  6.         var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  7.         return curSpace
  8.             .Cast<ObjectId>()
  9.             .Where(id => id.ObjectClass.DxfName == "INSERT")
  10.             .Select(id => (BlockReference)tr.GetObject(id, OpenMode.ForRead))
  11.             .Where(br => ((BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead)).Name == blockName)
  12.             .Select(br => br.ObjectId);
  13.     }
  14. }

а как сделать тут  чтобы можно было итерировать Id листов, чтобы получить блоки в каждом листе ?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
а как сделать тут  чтобы можно было итерировать Id листов, чтобы получить блоки в каждом листе ?
Тут не знаю как. А вообще проверить владельца ownerId для каждого из выбранных BlockReference и сравнить с ObjectId BlockTableRecord листов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение