Тема: объект AcDbDatabase внешней ссылки (Xref)

Из текущего чертежа можно получить дерево внешних ссылок AcDbXrefGraph. Итеративно можно получать доступ к отдельным узлам этого дерева AcDbXrefGraphNode. С узлом дерева связана база данных AcDbDatabase.

Вопрос такой. Если я хочу изменить чертеж внешней ссылки, корректно ли для этого использовать объект базы данных узла дерева (он почему то ссылается не на сам чертеж, а на какой-то временный файл)?

(изменено: Александр Ривилис, 30 октября 2011г. 14:10:13)

Re: объект AcDbDatabase внешней ссылки (Xref)

Al T пишет:

Вопрос такой. Если я хочу изменить чертеж внешней ссылки, корректно ли для этого использовать объект базы данных узла дерева (он почему то ссылается не на сам чертеж, а на какой-то временный файл)?

Корректно, но с некоторыми дополнениями:
1. Нужно заблокировать базу:

Acad::ErrorStatus es;
AcEdXrefFileLock mXFileLoc;
es = mXFileLoc.lockFile(mRetStat,pXrefDb->xrefBlockId());
if(Acad::eOk != es) return;

2. Нужно восстановить имена в состояние до разрешения имён в XREF:

es = pXrefDb->restoreOriginalXrefSymbols();

3. Выполнить модификацию базы. Тут всё что тебе нужно делать с базой внешней ссылки (!!!).

4. Освободить базу. Это приведёт к её сохранению и перезагрузку в текущий чертеж.

int mRet;
es = mXFileLoc.releaseFile(mRet);

5. Восстанавливаем xref в состояние внешней ссылки:

es = pXrefDb->restoreForwardingXrefSymbols();

Попробуй. Теоретически должно работать.

(изменено: Al T, 30 октября 2011г. 23:06:51)

Re: объект AcDbDatabase внешней ссылки (Xref)

Спасибо за ответ. Посмотрел. В документации примерно тоже написано. Я нашел еще другой способ. Насколько он хуже?

// pXrefNode указатель объекта класса AcDbXrefGraphNode
AcDbBlockTableRecordPointer pBTR(pXrefNode->btrId(), AcDb::kForRead);
const ACHAR * szXrefFileName = NULL;
pBTR->pathName(szXrefFileName);
AcDbDatabase * pXrefDatabase = new AcDbDatabase(Adesk::kFalse, Adesk::kTrue);
pXrefDatabase->readDwgFile(szXrefFileName, _SH_DENYRW);

// редактирование базы данных

pXrefDatabase->saveAs(szXrefFileName);
delete pXrefDatabase;                                     // можно использовать умные указатели, но не суть

Re: объект AcDbDatabase внешней ссылки (Xref)

Al T пишет:

Насколько он хуже?

Хуже тем, что:
1) Как минимум не хватает проверок на возможность чтения из этого файла.
2) Не будет обновлена внешняя ссылка, вставленная в открытые в редакторе AutoCAD чертежи.

Re: объект AcDbDatabase внешней ссылки (Xref)

Александр Ривилис пишет:
Al T пишет:

Насколько он хуже?

Хуже тем, что:

1) Как минимум не хватает проверок на возможность чтения из этого файла.

2) Не будет обновлена внешняя ссылка, вставленная в открытые в редакторе AutoCAD чертежи.

Да, со вторым вы точно правы. Обновление придется делать отдельным кодом.

А проверку на возврат функции AcDbDatabase::readDwgFile() надо делать также как и для AcEdXrefFileLock::lockFile().

А как насчет сравнения скорости этих способов?

Re: объект AcDbDatabase внешней ссылки (Xref)

Al T пишет:

А как насчет сравнения скорости этих способов?

Проверь. smile

Re: объект AcDbDatabase внешней ссылки (Xref)

Ok  :)  Спасибо за помощь