Общее планирование реакторного процесса
Окончательная компоновка
|
| ||||
Общее планирование реакторного процесса |
| ||||
На этом занятии нам придется описать несколько новых функций. Но основной упор будет сделан не на подробное рассмотрение нового кода, а на изложение общих концепций, которые служат базой для программы. Целью данного занятия является создание законченного приложения, аналогичного тому, что использовалось для построения парковой дорожки на занятии 1.
Примечание В процессе разработки и отладки приложений с реакторами всегда существует потенциальная опасность, что AutoCAD® останется в нестабильном состоянии. Это может быть вызвано различными причинами например, невозможности удалить реакторы удаленных объектов. Поэтому рекомендуется перед началом 7 занятия сохранить все открытые файлы, закрыть VLISP, выйти из AutoCAD и перезапустить оба приложения. Начнем с того, что загрузим проект в том виде, каким он стал к концу шестого занятия. В приложении парковой дорожки осталось выполнить две основных задачи: Необходимо также решить, каким образом программа будет обращаться с глобальными переменными. Часто требуется, чтобы глобальные переменные сохраняли свои значения в течении всего сеанса AutoCAD. Однако в случае с реакторами это не так. Чтобы понять почему, представим себе, что пользователь построил с помощью нашего приложения несколько парковых дорожек в одном рисунке. После этого пользователь начал стирать их, сначала по одной, затем по две и т.д., до тех пор пока все дорожки, кроме одной, не оказались стертыми. На занятии 5 была введена глобальная переменная *reactorsToRemove*, ответственная за хранение указателей на реакторы для удаляемых полилиний. Объявление переменной *reactorsToRemove* в функции gp:outline-erased означает, что полилиния сейчас будет удалена. В действительности же полилиния удаляется только после вызова функции gp:command-ended. При первом стирании полилинии все работает правильно. Указатель на реактор хранится в gp:outline-erased. При вызове функции gp:command-ended удаляются все плитки, связанные с полилинией, к которой был прикреплен реактор. После этого пользователь решает удалить две дорожки. В результате приложение получает два вызова функции gp:outline-erased, по одному на каждую стираемую полилинию. Здесь возникают две потенциальные проблемы: Невыполнение этих требований (корректная структура данных в виде списка и сброс значений глобальной переменной) может привести к непредсказуемому поведению программы. В случае реакторов непредвиденные результаты могут стать причиной неустранимой ошибки в сеансе AutoCAD. Ниже приведена цепь событий при стирании пользователем двух парковых дорожек одной командой. Следует обратить внимание на глобальные переменные: Приложение получает отклик на gp:outline-erased для одной из полилиний. Указатель на реактор добавляется в пустую глобальную переменную *reactorsToRemove*. Приложение получает отклик на gp:outline-erased для второй полилинии. Добавьте ее указатель на реактор к глобальной переменной *reactorsToRemove*, которая уже содержит один указатель на реактор. Кроме глобальной переменной *reactorsToRemove* приложение также содержит глобальную переменную *polyToChange* которая хранит указатели на изменяемые полилинии. Две дополнительные глобальные переменные для приложения будут представлены позже на этом занятии. Темы: Реакция на вызываемые пользователем команды Хранение информации с реакторами |