Как найти все вставки динамического блока

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

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

Оффлайн Александр РивилисАвтор темы

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
За перевод статьи огромное спасибо! Очень полезный материал!
Пара замечаний:
Цитировать
получаем запись таблицы блоков и смотри анонимная ли она
Судя по коду, смотрим, является ли она записью динамического блока, а не анонимного.

Это из справки:
Цитировать
Retrieves a collection populated with the ObjectIds of the anonymous blocks created from the dynamic block definition.
Это в комментариях:
Цитировать
получаем все анонимные блоки динамического блока
Получаем "блоки". Что это: описание блока, или вставка блока? Судя по коду далее - это все-таки описание.
P.S. А как подразумевается выполнять поиск информации в статьях? Путь моего поиска этой статьи был очень длинным. Можно сказать, случайно наткнулся. Научите, пожалуйста! А то уже не первый раз ищу везде где только можно, а оказывается, что давным-давно тут есть переведенная статья на эту тему.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Получаем "блоки". Что это: описание блока, или вставка блока? Судя по коду далее - это все-таки описание.
Описание блока. Чаще всего в оригинале "block" - это описание блока, а "block reference" (или "insert") - это вставка блока.
А как подразумевается выполнять поиск информации в статьях?
Ну вообще-то на сайте есть поиск, но я предпочитаю гугловский поиск, так как он значительно мощнее и интеллектуальнее, чем поиск на сайте:



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

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Позволю себе провокационный вопрос: а если дин.блок вставлен внутрь другого блока - опубликованный код вернет это вхождение или нет?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Позволю себе провокационный вопрос: а если дин.блок вставлен внутрь другого блока - опубликованный код вернет это вхождение или нет?
Тогда нужно использовать GetBlockReferenceIds(false,true);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ну вообще-то на сайте есть поиск, но я предпочитаю гугловский поиск, так как он значительно мощнее и интеллектуальнее, чем поиск на сайте:
А ведь действительно! Поиском все прекрасно находится, даже встроенным. Надо взять за правило - в первую очередь искать тут :)
Чаще всего в оригинале "block" - это описание блока, а "block reference" (или "insert") - это вставка блока.
В общем-то да, но для ясности, лучше бы уточняли. Сугубо мое личное мнение :)

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Принимая во внимание 32 строку, ИМХО стоит поменять 36 строку на что-то типа: "\nДинамическому блоку \"{0}\" соответствуют {2} вставок блока, из них {1} анонимных.\n" или что то подобное...

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Владимир Шу,
Замечание принято!
Просмотрел еще раз внимательно код и понял, что эта формулировка будет неправильной, т.к. в действительности там не вставки анонимных блоков (BlockReference) подсчитываются, а именно анонимные блоки (BlockTableRecord). Так что там или алгоритм менять или не трогать строку вывода.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Теперь я что то не понимаю.
в 19 строке из определения блока получают ссылки на анонимные  определения того же блока.
в 21 строке в коллекцию dynBlockRefs  заносятся вхождения блока, потом в 30 строке в цикле проходятся по анонимным определениям блока и в ту же коллекцию заносят их вхождения (строка 32), т.е в dynBlockRefs должны быть ссылки на все вхождения динамического блока, не важно измененные или нет, это как в быстром поиске искать блок по имени, получишь все вхождения.

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

Написал и засомневался... наверное следует понимать так:
У динамического блока "дверь" имеется  5 анонимных определений блоков и всего 12 вхождений всех определений блоков.  Фраза в коде корявая, но да, поторопился, не надо было писать предложение.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
У динамического блока "дверь" имеется  5 анонимных определений блоков и всего 12 вхождений всех определений блоков.
Именно так.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Позволю себе провокационный вопрос: а если дин.блок вставлен внутрь другого блока - опубликованный код вернет это вхождение или нет?
Отвечу на этот провокационный вопрос: этот способ поиска всех вхождений работает только если динамический блок не вставлен в другой блок или если и вставлен, но этот блок в единственном экземпляре, если копий блока много, то ничего не получится.
После того, как на это напоролся, попробовал посмотреть что там MgdDbg показывает и вот пример:
Если 4 одинаковых дин. боков (на картинке красные треугольники - блок с именем "АМ_Номер_пола") объединить в один и потом этот один скопировать, то и GetBlockReferenceIds(true,true) вернет вот такое:

т.е. только 4 вхождения
а при GetBlockReferenceIds(false,true) вернется вхождений...  4 вхождений блока и еще два - вхождения внутри которого этот блок находится, на картинке это блоки с номерами 48E1 и 48E2, вместо ожидаемых 8

а если и эти два блока засунуть в еще один, но будет вот так:



Вот как-то так... т.е. при GetBlockReferenceIds(false,true) нужно еще и проверять, ссылки на нужные ли тебе блоки вернули =(

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Off-Topic: показать
Я буду дрянью, но все равно спрошу - и чем же такие решения будут отличаться от тупого "прохода" по всем описаниям блоков чертежа? Что-то у меня подозрения, что практически ничем...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
ну отличаться будет тем, что перебирать нужно все таки не все блоки, а только часть, что вроде быстрее, но все равно очень неожиданно.
Кстати, датаэкстркт количество блоков считает правильно, вне зависимости вложенные они или нет.

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Дополню.
Если искомые блоки находятся внутри другого блока, то при GetBlockReferenceIds(false,true) вернутся ID искомых блоков и блоков в которых они находятся, но если искомые блоки находятся внутри XRef, то и GetBlockReferenceIds(true,true) и GetBlockReferenceIds(false,true)  вернут одинаковый результат содержащий только ID искомых блоков, ID Xref в которых находятся блоки эти методы не возвращают. Так что все XRef-ы нужно обрабатывать отдельно =(

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Так что все XRef-ы нужно обрабатывать отдельно =(
Конечно. XRef'ы - это отдельные базы (Database), которые не сканируются при вызове GetBlockReferenceIds
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение