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

Статьи => Опубликованные статьи => Тема начата: Александр Ривилис от 04-08-2013, 16:37:19

Название: Как найти все вставки динамического блока
Отправлено: Александр Ривилис от 04-08-2013, 16:37:19
Как найти все вставки динамического блока (http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html)
Название: Re: Как найти все вставки динамического блока
Отправлено: Дмитрий Загорулькин от 16-06-2017, 23:52:54
За перевод статьи огромное спасибо! Очень полезный материал!
Пара замечаний:
Цитировать
получаем запись таблицы блоков и смотри анонимная ли она
Судя по коду, смотрим, является ли она записью динамического блока, а не анонимного.

Это из справки:
Цитировать
Retrieves a collection populated with the ObjectIds of the anonymous blocks created from the dynamic block definition.
Это в комментариях:
Цитировать
получаем все анонимные блоки динамического блока
Получаем "блоки". Что это: описание блока, или вставка блока? Судя по коду далее - это все-таки описание.
P.S. А как подразумевается выполнять поиск информации в статьях? Путь моего поиска этой статьи был очень длинным. Можно сказать, случайно наткнулся. Научите, пожалуйста! А то уже не первый раз ищу везде где только можно, а оказывается, что давным-давно тут есть переведенная статья на эту тему.
Название: Re: Как найти все вставки динамического блока
Отправлено: Александр Ривилис от 18-06-2017, 00:14:22
Получаем "блоки". Что это: описание блока, или вставка блока? Судя по коду далее - это все-таки описание.
Описание блока. Чаще всего в оригинале "block" - это описание блока, а "block reference" (или "insert") - это вставка блока.
А как подразумевается выполнять поиск информации в статьях?
Ну вообще-то на сайте есть поиск, но я предпочитаю гугловский поиск, так как он значительно мощнее и интеллектуальнее, чем поиск на сайте:
(https://farm5.staticflickr.com/4202/34558870773_27c9bfa1d5_o.png)


Название: Re: Как найти все вставки динамического блока
Отправлено: Алексей Кулик от 18-06-2017, 20:32:16
Позволю себе провокационный вопрос: а если дин.блок вставлен внутрь другого блока - опубликованный код вернет это вхождение или нет?
Название: Re: Как найти все вставки динамического блока
Отправлено: Александр Ривилис от 18-06-2017, 20:54:43
Позволю себе провокационный вопрос: а если дин.блок вставлен внутрь другого блока - опубликованный код вернет это вхождение или нет?
Тогда нужно использовать GetBlockReferenceIds(false,true);
Название: Re: Как найти все вставки динамического блока
Отправлено: Дмитрий Загорулькин от 19-06-2017, 12:24:15
Ну вообще-то на сайте есть поиск, но я предпочитаю гугловский поиск, так как он значительно мощнее и интеллектуальнее, чем поиск на сайте:
А ведь действительно! Поиском все прекрасно находится, даже встроенным. Надо взять за правило - в первую очередь искать тут :)
Чаще всего в оригинале "block" - это описание блока, а "block reference" (или "insert") - это вставка блока.
В общем-то да, но для ясности, лучше бы уточняли. Сугубо мое личное мнение :)
Название: Re: Как найти все вставки динамического блока
Отправлено: Владимир Шу от 30-08-2019, 13:22:11
Принимая во внимание 32 строку, ИМХО стоит поменять 36 строку на что-то типа: "\nДинамическому блоку \"{0}\" соответствуют {2} вставок блока, из них {1} анонимных.\n" или что то подобное...
Название: Re: Как найти все вставки динамического блока
Отправлено: Александр Ривилис от 30-08-2019, 17:16:47
Владимир Шу,
Замечание принято!
Просмотрел еще раз внимательно код и понял, что эта формулировка будет неправильной, т.к. в действительности там не вставки анонимных блоков (BlockReference) подсчитываются, а именно анонимные блоки (BlockTableRecord). Так что там или алгоритм менять или не трогать строку вывода.
Название: Re: Как найти все вставки динамического блока
Отправлено: Владимир Шу от 30-08-2019, 21:08:48
Теперь я что то не понимаю.
в 19 строке из определения блока получают ссылки на анонимные  определения того же блока.
в 21 строке в коллекцию dynBlockRefs  заносятся вхождения блока, потом в 30 строке в цикле проходятся по анонимным определениям блока и в ту же коллекцию заносят их вхождения (строка 32), т.е в dynBlockRefs должны быть ссылки на все вхождения динамического блока, не важно измененные или нет, это как в быстром поиске искать блок по имени, получишь все вхождения.

В то же время в 36 строке говориться, что блоку соответствуют, условно, 5 анонимных блоков и 10 вставок блока

Написал и засомневался... наверное следует понимать так:
У динамического блока "дверь" имеется  5 анонимных определений блоков и всего 12 вхождений всех определений блоков.  Фраза в коде корявая, но да, поторопился, не надо было писать предложение.
Название: Re: Как найти все вставки динамического блока
Отправлено: Александр Ривилис от 30-08-2019, 21:14:52
У динамического блока "дверь" имеется  5 анонимных определений блоков и всего 12 вхождений всех определений блоков.
Именно так.
Название: Re: Как найти все вставки динамического блока
Отправлено: Владимир Шу от 18-09-2020, 19:08:17
Позволю себе провокационный вопрос: а если дин.блок вставлен внутрь другого блока - опубликованный код вернет это вхождение или нет?
Отвечу на этот провокационный вопрос: этот способ поиска всех вхождений работает только если динамический блок не вставлен в другой блок или если и вставлен, но этот блок в единственном экземпляре, если копий блока много, то ничего не получится.
После того, как на это напоролся, попробовал посмотреть что там MgdDbg показывает и вот пример:
Если 4 одинаковых дин. боков (на картинке красные треугольники - блок с именем "АМ_Номер_пола") объединить в один и потом этот один скопировать, то и GetBlockReferenceIds(true,true) вернет вот такое:
(https://i.postimg.cc/56XZKD0S/ice-screenshot-20200918-185442.png) (https://postimg.cc/56XZKD0S)
т.е. только 4 вхождения
а при GetBlockReferenceIds(false,true) вернется вхождений...  4 вхождений блока и еще два - вхождения внутри которого этот блок находится, на картинке это блоки с номерами 48E1 и 48E2, вместо ожидаемых 8
(https://i.postimg.cc/V0kdcmT6/ice-screenshot-20200918-185800.png) (https://postimg.cc/V0kdcmT6)
а если и эти два блока засунуть в еще один, но будет вот так:
(https://i.postimg.cc/LgL02FZc/ice-screenshot-20200918-190226.png) (https://postimg.cc/LgL02FZc)


Вот как-то так... т.е. при GetBlockReferenceIds(false,true) нужно еще и проверять, ссылки на нужные ли тебе блоки вернули =(
Название: Re: Как найти все вставки динамического блока
Отправлено: Алексей Кулик от 18-09-2020, 21:14:46
Off-Topic: показать
Я буду дрянью, но все равно спрошу - и чем же такие решения будут отличаться от тупого "прохода" по всем описаниям блоков чертежа? Что-то у меня подозрения, что практически ничем...
Название: Re: Как найти все вставки динамического блока
Отправлено: Владимир Шу от 19-09-2020, 11:48:11
ну отличаться будет тем, что перебирать нужно все таки не все блоки, а только часть, что вроде быстрее, но все равно очень неожиданно.
Кстати, датаэкстркт количество блоков считает правильно, вне зависимости вложенные они или нет.
Название: Re: Как найти все вставки динамического блока
Отправлено: Владимир Шу от 21-09-2020, 13:46:56
Дополню.
Если искомые блоки находятся внутри другого блока, то при GetBlockReferenceIds(false,true) вернутся ID искомых блоков и блоков в которых они находятся, но если искомые блоки находятся внутри XRef, то и GetBlockReferenceIds(true,true) и GetBlockReferenceIds(false,true)  вернут одинаковый результат содержащий только ID искомых блоков, ID Xref в которых находятся блоки эти методы не возвращают. Так что все XRef-ы нужно обрабатывать отдельно =(
Название: Re: Как найти все вставки динамического блока
Отправлено: Александр Ривилис от 21-09-2020, 13:49:53
Так что все XRef-ы нужно обрабатывать отдельно =(
Конечно. XRef'ы - это отдельные базы (Database), которые не сканируются при вызове GetBlockReferenceIds
Название: Re: Как найти все вставки динамического блока
Отправлено: Владимир Шу от 21-09-2020, 14:09:04
которые не сканируются при вызове GetBlockReferenceIds
и между тем список ID вхождений блоков внутри этих баз метод GetBlockReferenceIds выдает, но не выдает ID самих вхождений Xref