Работа с вставленными блоками

Автор Тема: Работа с вставленными блоками  (Прочитано 9220 раз)

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

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Если в документ вставляется внешний dwg (xattach), то в block table основного dwg содержатся только блоки внешнего файла с комбинированными именами. Записи для самого внешнего блока нет. После сохранения и/или открытия файла в block table содержится внешний блок, а его блоки исчезают. В External Reference Palette вставленный блок всегда показывается как и ожидается.
Как добраться до вставленного внешнего блока (нужно его имя файла) до сохранения dwg?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с вставленными блоками
« Ответ #1 : 01-12-2016, 21:48:01 »
Как добраться до вставленного внешнего блока (нужно его имя файла) до сохранения dwg?
Через AcDbXrefGraph (используя функцию acdbGetHostDwgXrefGraph)
Очень давно писал такое:
Код - C++ [Выбрать]
  1.  static void XrefUtilsGetAllXrefs(void)
  2.   {
  3.     Acad::ErrorStatus es;
  4.     AcDbXrefGraph graphXref;
  5.     if ((es = acdbGetHostDwgXrefGraph(acdbCurDwg(), graphXref)) == Acad::eOk) {
  6.       ////////////////////////////////////////////­//////////////////////////////
  7.       //     Дерево внешних ссылок всегда начинается с текущей базы.
  8.       //     По этой причине начинаем индексацию с 1, а не 0.
  9.       ////////////////////////////////////////////­//////////////////////////////
  10.       acutPrintf(L"\nВсего %d внешних ссылок",graphXref.numNodes()-1);
  11.       for (int idx=1; idx < graphXref.numNodes(); idx++) {
  12.         AcDbXrefGraphNode *nodeXref = graphXref.xrefNode(idx);
  13.         if (nodeXref) {
  14.           AcDbObjectId btrId = nodeXref->btrId();
  15.           AcDbBlockTableRecordPointer pBTR(btrId,AcDb::kForRead);
  16.           const ACHAR *path = NULL;
  17.           if ((es = pBTR.openStatus()) == Acad::eOk && (es = pBTR->pathName(path)) == Acad::eOk) {
  18.             acutPrintf(L"\n  Xref[%d]=%s path=\"%s\"",idx,nodeXref->name(),path);
  19.           } else {
  20.             acutPrintf(L"\nError=%s",acadErrorStatusText(es));
  21.           }
  22.         }
  23.       }
  24.     } else {
  25.       acutPrintf(L"\nacdbGetHostDwgXrefGraph(acdbCurDwg(), graphXref)=%s",acadErrorStatusText(es));
  26.     }
  27.   }
« Последнее редактирование: 02-12-2016, 02:15:28 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Работа с вставленными блоками
« Ответ #2 : 02-12-2016, 18:01:45 »
Через AcDbXrefGraph (используя функцию acdbGetHostDwgXrefGraph)
Увы, поведение точно такое же.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с вставленными блоками
« Ответ #3 : 02-12-2016, 18:30:26 »
Тогда объясни подробнее что ты делаешь:
1. Как открываешь чертеж или вставляешь в открытый?
2. Как вставляешь внешнюю ссылку?
3. Как её ищешь?
У меня получается всё нормально:



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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с вставленными блоками
« Ответ #4 : 02-12-2016, 18:31:15 »
Записи для самого внешнего блока нет.
У меня есть.
После сохранения и/или открытия файла в block table содержится внешний блок, а его блоки исчезают.
Что-то ты делаешь не то или чего-то недоговариваешь. Так быть не должно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Работа с вставленными блоками
« Ответ #5 : 02-12-2016, 20:02:02 »
Через AcDbXrefGraph (используя функцию acdbGetHostDwgXrefGraph)
Дело было не в бобине, работают оба способа нормально.
Теперь вопрос такой: есть принципиальные отличия обработки внешних блоков между просмотром таблицы блоков и использованием AcDbXrefGraph? Автокад 2007 - 2017.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с вставленными блоками
« Ответ #6 : 02-12-2016, 21:34:14 »
Дело было не в бобине, работают оба способа нормально.
Это хорошо. Объясни в чем было дело.
Просмотр через AcDbXrefGraph нужен только для получения дерева внешних ссылок. Если нужно получить перечень внешних ссылок, входящих в основную базу напрямую, то AcDbXrefGraph необязателен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Работа с вставленными блоками
« Ответ #7 : 07-12-2016, 20:11:47 »
Дело было не в бобине, работают оба способа нормально.
Это хорошо. Объясни в чем было дело.
"Играл ссылками и доигрался"  :D

Просмотр через AcDbXrefGraph нужен только для получения дерева внешних ссылок. Если нужно получить перечень внешних ссылок, входящих в основную базу напрямую, то AcDbXrefGraph необязателен.
Мне нужны только непосредственные xref, т.е. первого уровня дерева. Т.ч. делать через AcDbXrefGraph. Спасибо за помощь!

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Работа с вставленными блоками
« Ответ #8 : 07-12-2016, 21:18:08 »
Мне нужны только непосредственные xref, т.е. первого уровня дерева. Т.ч. делать через AcDbXrefGraph.
Нашел два способа:
1. В пример кода выше добавить фильтрацию по nodeXref->isNested();
2. Перебрать все out(ndx) из корневого AcDbXrefGraphNode

Что из них дает более гарантированный результат?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с вставленными блоками
« Ответ #9 : 08-12-2016, 10:59:20 »
1. В пример кода выше добавить фильтрацию по nodeXref->isNested();
Если у тебя есть AcDbDatabase *HostDwg - это dwg-файл, в котором тебя интересуют только прямые внешние ссылки, и ты построил граф при помощи acdbGetHostDwgXrefGraph(HostDwg,...) то этого должно быть достаточно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение