Тема: Перегрузить DWG Xrefs.

Необходимо перегрузить Xrefs с диска для текущего документа.
Нашел функцию acedXrefReload().
Затруднение с получением списка ids внешних ссылок:
XrefBTRids - List of BTR IDs to be xref reloaded.
И в целом немного запутан перекрестным упоминанием Block для с Xref. На сколько понимаю Block - это несколько объединенных в группу объектов. Или в ObjectARX данное понятие имеет другой смысл?

Re: Перегрузить DWG Xrefs.

Я так понял что тебе нужно перегрузить все внешние ссылки, вставленные в текущий чертеж? Если да, то проходишься по всем AcDbBlockTableRecord, находишь все, которые AcDbBlockTableRecord::isFromExternalReference и добавляешь их AcDbObjectId в массив XrefBTRids. Ну а затем вызываешь acedXrefReloadю

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Понял, спасибо.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Я делаю следующим образом

   AcDbBlockTable * pBlockTable;
   AcDbBlockTableRecord* pOtherMsBtr;
   AcDbBlockTableRecordIterator* pIter;
   AcDbObjectIdArray objIdArray;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
    pBlockTable->getAt(ACDB_MODEL_SPACE, pOtherMsBtr, AcDb::kForRead);
    pOtherMsBtr->newIterator(pIter);
    pBlockTable->close();
    for (pIter->start(); !pIter->done(); pIter->step()) {
        if (pIter->blockTableRecord()->isFromExternalReference()) {
            objIdArray.append(pIter->blockTableRecord()->objectId());
        }
    }
    delete pIter;
    pOtherMsBtr->close();
    acedXrefReload(objIdArray);

Однако, условие

pIter->blockTableRecord()->isFromExternalReference()

никогда не выполняется.. я взял "не ту" AcDbBlockTable?

Re: Перегрузить DWG Xrefs.

А ты не путаешь блоки и внешние ссылки? Набери в командной строке AutoCAD команду _XREF и посмотри есть ли там что-нибудь.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
В документе 2 внешние ссылки на dwg-файлы.

Re: Перегрузить DWG Xrefs.

Посмотри при помощи ARXDBG. Что-то у тебя странное.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Открыл Database info...
На вкладке SymbolTables в дереве есть узел Block Table с 5-тью элементами:

Block Table
 |-*Model_Space
 |-*Paper_Space
 |-*Paper_Space0
 |-3000009
 |-3000010

Два последних элемента - имена внешних ссылок.

Re: Перегрузить DWG Xrefs.

Попробуй так:

static void XrefAllReload(void)
{
  AcDbXrefGraph graphXref;
  if (acdbGetHostDwgXrefGraph(acdbCurDwg(), graphXref) == Acad::eOk) {
    //////////////////////////////////////////////////////////////////////////
    //     Дерево внешних ссылок всегда начинается с текущей базы.
    //     По этой причине начинаем индексацию с 1, а не 0.
    //////////////////////////////////////////////////////////////////////////
    AcDbObjectIdArray ids;
    acutPrintf("\nВсего %d внешних ссылок",graphXref.numNodes()-1);
    for (int idx=1; idx < graphXref.numNodes(); idx++) {
      AcDbXrefGraphNode *nodeXref = graphXref.xrefNode(idx);
      if (nodeXref) ids.append(nodeXref->btrId());
    }
    acedXrefReload(ids);
  }
}

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Подскажите, пожалуйста, как получить AcDbXrefGraph иным способом, не используя acdbGetHostDwgXrefGraph().
Я работаю с SDK 2000.

Re: Перегрузить DWG Xrefs.

Я работаю с SDK 2000.

Уууу! ObjectARX 2000 у меня под руками нет. А в ObjectARX 2002 есть функция acedGetCurDwgXrefGraph(описана в xgraph.h). Попробуй её.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Спасибо, Александр.
То, что нужно :)

Re: Перегрузить DWG Xrefs.

Проверил с этой функцией под AutoCAD 2006 - работает.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Проверил в AutoCAD 2002, 2004, 2006, 2008.
С AutoCAD 2002, как ни странно, проблемы.
Массив AcDbObjectIdArray заполняется двумя значениями, как и положено, а затем вызывается acedXrefReload(ids).
Но внешние ссылки не перегружаются.

Re: Перегрузить DWG Xrefs.

В остальных версиях нормально? Попробуй acedXrefReload(ids,false) и посмотри код возврата чтобы понять что происходит. Может это баг AutoCAD.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Кажется, я разобрался.. хотя поведение немного неожиданное.
AutoCAD 2002 держит файлы внешних ссылок (версии выше - не держат), поэтому я не могу заменить файлы но новые. Придется делать unload, как и в случае со вставленными картинками.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Александр, чтобы получить имена Xrefs, я взял первоначальный код, прошел итератором, и получил в итоге несколько AcDbBlockTableRecord с одним и тем же именем "*Model_Space".
Может быть это подскажет, где ошибка.

Re: Перегрузить DWG Xrefs.

Только сейчас взглянул сюда:  > equilibrium (2008-12-10 13:33:18) и понял, что там написана полная ерунда. Вместо того, чтобы пройти по таблице блоков, ты проходишься по всему, что вставлено в Model_Space.
Сравни:

void  GetAllXrefPathName()
{
  AcDbBlockTablePointer pBT(acdbCurDwg()->blockTableId(),AcDb::kForRead);
  if (pBT.openStatus() == Acad::eOk) {
    AcDbBlockTableIterator *pIter;
    if (pBT->newIterator(pIter) == Acad::eOk && pIter) {
      for (pIter->start();!pIter->done();pIter->step()) {
        AcDbObjectId eId;
        if (pIter->getRecordId(eId) == Acad::eOk) {
          AcDbBlockTableRecordPointer pBTR(eId,AcDb::kForRead);
          if (pBTR.openStatus() == Acad::eOk) {
            if (pBTR->isFromExternalReference()) {
              const TCHAR *path = NULL;
              if (pBTR->pathName(path) == Acad::eOk) {
                acutPrintf(_T("\nXref path=%s"),path);
              }
            }
          }
        }
      }
      delete pIter;
    }
  }
}

Re: Перегрузить DWG Xrefs.

Код проверял специально в AutoCAD 2002.

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Да, Александр, код работает, спасибо за помощь.
На основе этого кода пытаюсь сделать acedXrefUnload(), однако метод возвращает Acad::eWasOpenForRead, а на файле Xref появляется новая блокировка от acad.exe.
Если создаю RecordPointer так:

AcDbBlockTableRecordPointer pBTR(eId,AcDb::kForWrite);

то acedXrefUnload() возвращает Acad::eWasOpenForWrite и AutoCAD зависает.

Re: Перегрузить DWG Xrefs.

Сначала сделай pBTR->close()

Re: Перегрузить DWG Xrefs.

> Александр Ривилис
Спасибо, работает.