ObjectARX, AutoCAD. Среда программирования библиотеки C++

         

Всегда имейте текущую базу данных


Хотя 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(), ” относительно специальных соображений разрушения для вставленных баз данных.


Содержание раздела