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

ADN Club => AutoCAD .NET API => Тема начата: Yusuf от 02-11-2020, 07:40:24

Название: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Yusuf от 02-11-2020, 07:40:24
Здравствуйте, подскажите возможно ли найти все вставки динблоков по имени, если имя на кирилице или на кирилице и имеет пробелы в название? Нашел в сети пример скрипта от А. Ривилиса CalcBlock, CalcBlock1 но они не находит если имя на кирилице, можно ли находить в таком случае или требовать от пользователя чтобы имена блоков были на латинице и не имели пробелов? Я думаю с пробелом наверно не получится, даже если программно задавать имя блока или можно как то в кавычки засунуть  ?
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: avc от 02-11-2020, 11:00:49
Имена блоков прекрасно поддерживают как кириллицу, так и пробелы. В API тоже никаких проблем с этим нет - список вариантов динамического блока можно получить, список вставок блока ( BlockReference ) тоже. Так что проблема вымышленная.
Естественно для ввода имен удобней сделать маленькую форму, а не с консоли вводить. И лучше со списком всех имеющихся имен блоков.
И кстати, а чем не устраивает _SelectSimilar ?
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 02-11-2020, 11:54:24
Здравствуйте, подскажите возможно ли найти все вставки динблоков по имени, если имя на кирилице или на кирилице и имеет пробелы в название? Нашел в сети пример скрипта от А. Ривилиса CalcBlock, CalcBlock1 но они не находит если имя на кирилице, можно ли находить в таком случае или требовать от пользователя чтобы имена блоков были на латинице и не имели пробелов? Я думаю с пробелом наверно не получится, даже если программно задавать имя блока или можно как то в кавычки засунуть  ?
О каких это моих программах идёт речь? Не вижу ссылок и подтверждения, что что-то не работает.
Вот пример программы, которая должна работать: https://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Yusuf от 02-11-2020, 12:12:27
Так что проблема вымышленная.
да мне нечего делать и я выдумал

каких это моих программах идёт речь? Не вижу ссылок и подтверждения, что что-то не работает.
Вот пример программы, которая должна работать: 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

не работает с кирилицей и если содержит пробелы
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 02-11-2020, 12:27:48
https://forums.autodesk.com/t5/net/c-find-block-references-by-name/td-p/1672857

не работает с кирилицей и если содержит пробелы
Этот код вообще не работает с динамическими блоками, а не только с кирилицей или пробелами. Коду почти 15 лет и динамические блоки тогда только появились.
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 02-11-2020, 12:29:29
Цитата: Александр Ривилис от 02-11-2020, 10:54:24

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

да мне нечего делать и я выдумал
Это не моя цитата. Так что будь внимательнее.
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: avc от 02-11-2020, 12:36:03
да мне нечего делать и я выдумал
Не выдумал, а сохранил в тайне код, который не работает.
Как я сразу и понял вы пытаетесь, ввести строку с пробелами через командную строку. Это возможно, но нужно включить опцию PromptStringOptions.AllowSpaces.
Ну и искать объекты в базе данных чертежа, а не селектом с фильтрами
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Yusuf от 02-11-2020, 13:35:00
Это не моя цитата. Так что будь внимательнее.
извиняюсь не обратил внимания на это и спасибо за ссылку
Не выдумал, а сохранил в тайне код, который не работает.
Как я сразу и понял вы пытаетесь, ввести строку с пробелами через командную строку. Это возможно, но нужно включить опцию PromptStringOptions.AllowSpaces.
Ну и искать объекты в базе данных чертежа, а не селектом с фильтрами
Мне надо не во всей базе а только в модели, поэтому пользовался тем старым пользовался
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 02-11-2020, 14:52:47
Мне надо не во всей базе а только в модели, поэтому пользовался тем старым пользовался
Можно пользоваться тем кодом, который я дал в ссылке, только проверять значение OwnerId - если это ModelSpace, то берёшь, если нет - пропускаешь.
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Yusuf от 02-11-2020, 15:48:23
Можно пользоваться тем кодом, который я дал в ссылке, только проверять значение OwnerId - если это ModelSpace, то берёшь, если нет - пропускаешь.
OwnerId  пытаюсь найти через дебаг, есть кажется только у anonymousBtr и он возвращает числа, как проверить их, лежит ли в модели
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: avc от 02-11-2020, 16:07:54
Владелец есть у всех Entity, у все объектов вставляемых в чертеж. Вангую что вы пытаетесь найти OwnerId у BTR блока. Их там нет. BTR не вставляются в чертеж. Это только описание блока, но не Entity.  Надо взять все ссылки на блок (BlockReference) и уже смотреть куда они вставлены - в модель, на бумагу или в другие блоки.
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Дмитрий Загорулькин от 02-11-2020, 18:08:03
Я у Entity обычно проверяю не OwnerId, а BlockId: https://help.autodesk.com/view/OARX/2021/ENU/?guid=OARX-ManagedRefGuide-Autodesk_AutoCAD_DatabaseServices_Entity_BlockId
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: avc от 02-11-2020, 20:20:44
Точно! У DBObject есть OwnerId, но это не то. Он у меня в коде один раз используется только у атрибутов. На пространство, куда вставлен Entity указывает именно   BlockId
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 02-11-2020, 20:37:53
Точно! У DBObject есть OwnerId, но это не то. Он у меня в коде один раз используется только у атрибутов. На пространство, куда вставлен Entity указывает именно   BlockId
Для примитивов в блоке (в том числе в ModelSpace/PaperSpace) BlockId и OwnerId - это одно и тоже.
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Yusuf от 03-11-2020, 07:35:16
Для примитивов в блоке (в том числе в ModelSpace/PaperSpace) BlockId и OwnerId - это одно и тоже.
да оказывается одно и то же, только они же числа возращают и в дебаге не нашел есть все кроме Modelspace.
(https://i.postimg.cc/t10pzT9r/11.jpg) (https://postimg.cc/t10pzT9r)
Нашел через ArxDBG что Modelspace есть в поле Block и  и MgdDbg  показывает что он в поле Name находится в SymbolTableRecord, а не в BlockTableRecord

(https://i.postimg.cc/xkbq0h1Z/1.jpg) (https://postimg.cc/xkbq0h1Z)

(https://i.postimg.cc/kR75v5vr/2.jpg) (https://postimg.cc/kR75v5vr)

(https://i.postimg.cc/CnJxPVcR/3.jpg) (https://postimg.cc/CnJxPVcR)

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

p.p.p.s Хотел проверить на совпадение имени блока и получил Model_Space оказывается у Entity.Blockname показывает где он лежит или я не прав?
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Дмитрий Загорулькин от 03-11-2020, 10:48:36
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, которое сводится, по сути, к сравнению чисел.
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 03-11-2020, 12:27:54
Yusuf,
Разобрался уже или нет? Или нужно писать пример кода?
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Yusuf от 03-11-2020, 13:07:49
Сравнивать лучше всего не по имени, а как раз по Id. Если Entity.BlockId (или OwnerId) равен Id модели - значит, объект (примитив) находится в модели.
спасибо так и буду делать
Разобрался уже или нет? Или нужно писать пример кода?
Да вроде разобрался, спасибо что Вы есть
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 04-11-2020, 12:24:12
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. }
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Yusuf от 13-04-2021, 16:13:00
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 листов, чтобы получить блоки в каждом листе ?
Название: Re: Найти все вставки динамического блока если имя блока на кирилице
Отправлено: Александр Ривилис от 13-04-2021, 20:09:16
а как сделать тут  чтобы можно было итерировать Id листов, чтобы получить блоки в каждом листе ?
Тут не знаю как. А вообще проверить владельца ownerId для каждого из выбранных BlockReference и сравнить с ObjectId BlockTableRecord листов.