function AdUpdateAUTOEXEC (szSharedPath)
STRING szRootPath, szBatchName, szBatchFile,
szBackupName, szTestLine, szCheckForPathLine;
NUMBER nReturn, nvHandle;
STRING szOutput;
begin
szOutput = "SET PATH=%PATH%;" + szSharedPath;
// Obtain the filename of the system batch file.
BatchGetFileName (szBatchFile);
ParsePath(szRootPath, szBatchFile, PATH);
// Make sure we’re pointing at the root of the system
VarSave(SRCTARGETDIR);
TARGETDIR = szRootPath;
SRCDIR = szRootPath;
// See if we have an AUTOEXEC.
if (Is(FILE_EXISTS, szBatchFile) = FALSE) then
// If we don’t, just write ’ours’ out and no more
OpenFileMode (FILE_MODE_NORMAL);
ParsePath(szBatchFile, szBatchFile, FILENAME);
CreateFile (nvHandle, SRCDIR, szBatchFile);
WriteLine (nvHandle, szOutput);
CloseFile (nvHandle);
bNeedReboot = TRUE;
else
ParsePath(szBatchName, szBatchFile, FILENAME_ONLY);
szBackupName = szBatchName + ".ADK";
ParsePath(szBatchFile, szBatchFile, FILENAME);
OpenFileMode(FILE_MODE_NORMAL);
nReturn = OpenFile (nvHandle, SRCDIR, szBatchFile);
if (nReturn = 0 ) then
// Spin down to find the non-blank last line in
// the file
while (nReturn = 0 )
nReturn = GetLine(nvHandle, szTestLine);
if (StrLength(szTestLine) > 0) then
szCheckForPathLine = szTestLine;
endif;
endwhile;
CloseFile(nvHandle);
// We now have the last text entry in the batch
// file.
if (StrFind(szCheckForPathLine, szSharedPath) < 0) then
Disable(LOGGING);
// Backup up the original
nReturn = CopyFile (szBatchFile, szBackupName);
Enable(LOGGING);
if (nReturn = 0 ) then
OpenFileMode (FILE_MODE_APPEND);
OpenFile(nvHandle, SRCDIR, szBatchFile);
WriteLine(nvHandle,"");
WriteLine(nvHandle, szOutput);
CloseFile(nvHandle);
bNeedReboot = TRUE;
endif;
endif;
endif;
endif;
VarRestore(SRCTARGETDIR);
end;
Советы и технические приемы
Поскольку ObjectDBX работает без AutoCAD, ваше приложение должно проявить внимание к элементам, которые программа ObjectARX не была бы должна адресовать. Эти элементы включают AcDbDatabase и использование разделов области просмотра, использование DWG файлов от более ранних выпусков, и имеющий дело с расширенными Данными Примитива (EED) и растровыми изображениями. Все эти темы и больше обсуждены в этой секции.
ACAD_OBJID_INLINE_INTERNAL
Файлы заголовка acdb. h и dbidar. h содержат #ifdef Секцию, которая выбирает заголовок к #include Основанный на макрокоманде ACAD_OBJID_INLINE_INTERNAL.
Приложения должны никогда #define Это значение. Этот #define Предназначен для Autodesk внутреннее использование только. Приложения, которые включают #define Макрокоманду ACAD_OBJID_INLINE_INTERNAL, не будут компилировать успешно.
AcDbDatabase - советы
ObjectDBX позволяет Вам иметь несколько образцов класса AcDbDatabase, хотя Вы должны убедиться, что удалили их всех перед вашими прикладными выходами. Также важно, что Вы всегда имеете один образец AcDbDatabase, который является текущей базой данных. Эти требования описаны в следующих секциях.
Всегда Инициализируйте AcDbDatabase
Вы должны всегда инициализировать по крайней мере один объект AcDbDatabase перед использованием любого кода AcDb. Это - то, потому что создание полного AcDbDatabase инициализирует набор глобальных переменных, которых некоторые библиотечные элементы требуют. (См. setWorkingDatabase () метод AcDbHostApplicationServices класса в ObjectARX Ссылке для подробностей.) Когда AutoCAD присутствует, имеется всегда “текущий рисунок” AcDbDatabase, что ObjectARX полагается, чтобы удовлетворить все эти требования. Приложение ObjectDBX должно подражать этому поведению.
Если Вы намереваетесь записать непосредственно к вашей базе данных, Вы должны инициализировать это, используя конструктор AcDbDatabase с Adesk:: kTrue параметр. Эта версия конструктора создает жизнеспособный пустой рисунок, готовый к модификации и формирует таблицы базы данных и инициализирует их к значениям по умолчанию. Следующее - пример инициализирования базы данных:
AcDbDatabase *pDb = new AcDbDatabase(Adesk::kTrue);
Если Вы намереваетесь читать чертежный файл в базу данных, используйте конструктор AcDbDatabase с Adesk:: kFalse параметр, немедленно сопровождаемый запросом к readDwgFile () функция. Эта версия конструктора создает полностью пустую базу данных, которая полагается на последующий запрос к readDwgFile () чтобы заполнить его внутренние структуры данных. При использовании они в комбинации улучшают эффективность при чтении DWG файла по использованию другой формы конструктора, потому что таблицы и глобальные переменные должны только быть инициализированными однажды readDwgFile (). Имеется пример чтения рисунка в предварительно инициализированную базу данных:
AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
pDb->readDwgFile(filename);
Множитель вызывает к readDwgFile () на той же самой базе данных, не поддержаны.
И в ObjectARX и ObjectDBX, вызывая readDwgFile () после использования Adesk:: kTrue форма конструктора некоторый, чтобы вызвать отказ{*неудачу*}, если версия DWG файла, который Вы читаете - Выпуск 12 или ранее. Это из-за несогласованности в пути, которым рисунки загружены до Выпуска AutoCAD 13.
Поскольку Вы не можете предсказывать, которые рисунки ваши конечные пользователи откроются, не закодируйте следующее:
// Не Делать этого.
AcDbDatabase *pDb = new AcDbDatabase(Adesk::kTrue);
pDb->readDwgFile(filename);
Всегда имейте текущую базу данных
Хотя 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(), ” относительно специальных соображений разрушения для вставленных баз данных.
AcDbDatabase:: insert()
При вставке одной базы данных в другой, порядок разрушения критический.
При использовании этой функции, база данных, выполняющая вставку - "К" базе данных, и используемой базе данных, поскольку параметр - “От” базы данных. Всегда уничтожьте “От” базы данных сначала, и "К" базе данных последний; иначе Вы вызовете фатальную ошибку в ObjectDBX DLL.
Поиск активных областей просмотра в пространстве модели
При создании нового DWG файла с AcDbDatabase (Adesk:: kTrue) конструктор, Вы должны установить заданную по умолчанию область просмотра пространства модели в некоторые разумные параметры. Это будет гарантировать, что DWG будет видим в AutoCAD когда открыто. Отказ устанавливать заданную по умолчанию область просмотра пространства модели может требовать, чтобы пользователь AutoCAD, чтобы выбрать Изменил масштаб изображения Всех, чтобы делать геометрию из видимого рисунка. Кроме того, некоторые примитивы AutoCAD требуют, чтобы разумные параметры области просмотра вычислили аспекты их появления. Например, объект AcDbSpline, созданный в ObjectDBX, и сохраненный к рисунку без любого внимания к области просмотра, может отображать с острыми углами, подобно pline, когда загружено в AutoCAD. Данные не повреждены и первый раз, когда примитив отредактирован в AutoCAD, AcDbSpline возвратится к его надлежащей форме.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


