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

ADN Club => ObjectARX => Тема начата: LegaCAD от 01-12-2016, 21:27:53

Название: Работа с вставленными блоками
Отправлено: LegaCAD от 01-12-2016, 21:27:53
Если в документ вставляется внешний dwg (xattach), то в block table основного dwg содержатся только блоки внешнего файла с комбинированными именами. Записи для самого внешнего блока нет. После сохранения и/или открытия файла в block table содержится внешний блок, а его блоки исчезают. В External Reference Palette вставленный блок всегда показывается как и ожидается.
Как добраться до вставленного внешнего блока (нужно его имя файла) до сохранения dwg?
Название: Re: Работа с вставленными блоками
Отправлено: Александр Ривилис от 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.   }
Название: Re: Работа с вставленными блоками
Отправлено: LegaCAD от 02-12-2016, 18:01:45
Через AcDbXrefGraph (используя функцию acdbGetHostDwgXrefGraph)
Увы, поведение точно такое же.
Название: Re: Работа с вставленными блоками
Отправлено: Александр Ривилис от 02-12-2016, 18:30:26
Тогда объясни подробнее что ты делаешь:
1. Как открываешь чертеж или вставляешь в открытый?
2. Как вставляешь внешнюю ссылку?
3. Как её ищешь?
У меня получается всё нормально:



Название: Re: Работа с вставленными блоками
Отправлено: Александр Ривилис от 02-12-2016, 18:31:15
Записи для самого внешнего блока нет.
У меня есть.
После сохранения и/или открытия файла в block table содержится внешний блок, а его блоки исчезают.
Что-то ты делаешь не то или чего-то недоговариваешь. Так быть не должно.
Название: Re: Работа с вставленными блоками
Отправлено: LegaCAD от 02-12-2016, 20:02:02
Через AcDbXrefGraph (используя функцию acdbGetHostDwgXrefGraph)
Дело было не в бобине, работают оба способа нормально.
Теперь вопрос такой: есть принципиальные отличия обработки внешних блоков между просмотром таблицы блоков и использованием AcDbXrefGraph? Автокад 2007 - 2017.
Название: Re: Работа с вставленными блоками
Отправлено: Александр Ривилис от 02-12-2016, 21:34:14
Дело было не в бобине, работают оба способа нормально.
Это хорошо. Объясни в чем было дело.
Просмотр через AcDbXrefGraph нужен только для получения дерева внешних ссылок. Если нужно получить перечень внешних ссылок, входящих в основную базу напрямую, то AcDbXrefGraph необязателен.
Название: Re: Работа с вставленными блоками
Отправлено: LegaCAD от 07-12-2016, 20:11:47
Дело было не в бобине, работают оба способа нормально.
Это хорошо. Объясни в чем было дело.
"Играл ссылками и доигрался"  :D

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

Что из них дает более гарантированный результат?
Название: Re: Работа с вставленными блоками
Отправлено: Александр Ривилис от 08-12-2016, 10:59:20
1. В пример кода выше добавить фильтрацию по nodeXref->isNested();
Если у тебя есть AcDbDatabase *HostDwg - это dwg-файл, в котором тебя интересуют только прямые внешние ссылки, и ты построил граф при помощи acdbGetHostDwgXrefGraph(HostDwg,...) то этого должно быть достаточно.