Всегда имейте текущую базу данных
Хотя ObjectDBX позволяет Вам создавать много образцов AcDbDatabase, только можно быть текущая база данных. AcDb поддерживает внутренний глобальный указатель на эту текущую базу данных, и AcDbHostApplicationServices метод workingDatabase () возвращает копию этого внутреннего указателя. Всякий раз, когда AcDbDatabase:: readDwgFile () метод используется, внутренний текущий указатель базы данных сброшен, чтобы указать на ту базу данных. Когда база данных, которая является текущей, удалена, внутренний текущий указатель базы данных установлен в NULL.
Это означает, что в ситуациях, где ваш код читает, множественные базы данных и возможно удаляют некоторых из них по пути, Вы должны убедиться, что Вы используете AcDbHostApplicationServices::setWorkingDatabase() метод в соответствующих местах, чтобы установить внутренний текущий указатель базы данных на надлежащую текущую базу данных.
Например, следующий код читает в одной базе данных, указанной pDbFirst (вызовите эту базу данных “сначала”). Это заставляет внутренний текущий указатель базы данных быть установленным в базу данных “ сначала. ” Код тогда читает в другой базе данных, указанной pDbSecond (вызовите эту базу данных “вторая”), который теперь заставляет внутренний текущий указатель базы данных быть установленным в базу данных “вторая”. Код затем вставляет базу данных “вторая” в базу данных “сначала” и удаляет базу данных “вторая”. Когда база данных “секунда” удалена, внутренний текущий указатель базы данных указывает на это, так что внутренний указатель установлен в NULL. Это означает, что после того, как стирание базы данных, AcDb имеет указатель текущего рисунка NULL. Это ведет к фатальным ошибкам, если любой код, к которому к ссылкам внутренний текущий указатель базы данных обращаются.
Чтобы предотвращать это, после стирания базы данных “вторая” в коде вашего приложения, код должен назвать ведущей setWorkingDatabase() методом, проходящим в указателе на базу данных “сначала”, чтобы восстановить базу данных “сначала” как текущая база данных для ObjectDBX, следующим образом:
// Делать "сначала" текущую базу данных.
AcDbDatabase *pDbFirst = new AcDbDatabase(Adesk::kFalse);
pDbFirst->readDwgFile("first.dwg");
// Теперь заставите "секунду" быть текущая база данных.
AcDbDatabase *pDbSecond = new AcDbDatabase(Adesk::kFalse);
pDbSecond->readDwgFile("second.dwg");
// Вставить "секунду" в "первый" как ABLOCK.
Acad::ErrorStatus es;
AcDbObjectId blockId;
es = pDbFirst->insert(blockId, "ABLOCK", pDbSecond);
// Удаление "секунды" делает текущую базу данных NULL.
delete
pDbSecond;
// Делать текущую базу данных "сначала" снова.
myHostServices->setWorkingDatabase(pDbFirst);
Удалите все AcDbDatabases
при выходе из приложения
Всегда удалите все базы данных перед переходом к вашему приложению. Кроме порождения утечки памяти в вашем приложении, отказ удалять все базы данных может приводить к фатальной ошибке на закрытии. Пожалуйста также см. следующую секцию, “ AcDbDatabase::insert(), ” относительно специальных соображений разрушения для вставленных баз данных.