Группы пользователей Autodesk

Общее планирование реакторного процесса


Окончательная компоновка

 

Окончательная компоновка 
 

Общее планирование реакторного процесса



На этом занятии нам придется описать несколько новых функций. Но основной упор будет сделан не на подробное рассмотрение нового кода, а на изложение общих концепций, которые служат базой для программы. Целью данного занятия является создание законченного приложения, аналогичного тому, что использовалось для построения парковой дорожки на занятии 1.

Примечание В процессе разработки и отладки приложений с реакторами всегда существует потенциальная опасность, что AutoCAD® останется в нестабильном состоянии. Это может быть вызвано различными причинами например, невозможности удалить реакторы удаленных объектов. Поэтому рекомендуется перед началом 7 занятия сохранить все открытые файлы, закрыть VLISP, выйти из AutoCAD и перезапустить оба приложения.

Начнем с того, что загрузим проект в том виде, каким он стал к концу шестого занятия.

В приложении парковой дорожки осталось выполнить две основных задачи:

  • Написать функции отклика для реактора объекта.
  • Написать функции отклика для реактора редактора.
  • Необходимо также решить, каким образом программа будет обращаться с глобальными переменными. Часто требуется, чтобы глобальные переменные сохраняли свои значения в течении всего сеанса AutoCAD. Однако в случае с реакторами это не так. Чтобы понять почему, представим себе, что пользователь построил с помощью нашего приложения несколько парковых дорожек в одном рисунке. После этого пользователь начал стирать их, сначала по одной, затем по две и т.д., до тех пор пока все дорожки, кроме одной, не оказались стертыми.

    На занятии 5 была введена глобальная переменная *reactorsToRemove*, ответственная за хранение указателей на реакторы для удаляемых полилиний. Объявление переменной *reactorsToRemove* в функции gp:outline-erased означает, что полилиния сейчас будет удалена. В действительности же полилиния удаляется только после вызова функции gp:command-ended.


    При первом стирании полилинии все работает правильно. Указатель на реактор хранится в gp:outline-erased. При вызове функции gp:command-ended удаляются все плитки, связанные с полилинией, к которой был прикреплен реактор. После этого пользователь решает удалить две дорожки. В результате приложение получает два вызова функции gp:outline-erased, по одному на каждую стираемую полилинию. Здесь возникают две потенциальные проблемы:

  • При выполнении функции setq для переменной *reactorsToRemove* необходимо добавить к этой переменной указатель на реактор, не стирая уже имеющихся в ней значений. Это означает, что переменная *reactorsToRemove* должна иметь структуру списка, в который можно добавлять указатели на реакторы. Таким образом, можно будет хранить несколько указателей на реакторы по количеству дорожек, удаляемых пользователем с помощью одной команды.


  • При каждом вызове функции gp:command-will-start, обозначающей начало новой последовательности команд, необходимо сбрасывать значение переменной *reactorsToRemove* в nil. Это необходимо, чтобы глобальная переменная не хранила указатели на реакторы после предыдущих команд "Стереть".


  • Невыполнение этих требований (корректная структура данных в виде списка и сброс значений глобальной переменной) может привести к непредсказуемому поведению программы. В случае реакторов непредвиденные результаты могут стать причиной неустранимой ошибки в сеансе AutoCAD.

    Ниже приведена цепь событий при стирании пользователем двух парковых дорожек одной командой. Следует обратить внимание на глобальные переменные:

  • Вызвать команду стереть. Запускается функция gp:command-will-start. Переменной *reactorsToRemove* присваивается значение nil.


  • Выбрать две полилинии. Приложение еще не получило сигнала.


  • Нажать ENTER для стирания двух выбранных полилиний.


  • Приложение получает отклик на gp:outline-erased для одной из полилиний. Указатель на реактор добавляется в пустую глобальную переменную *reactorsToRemove*.

    Приложение получает отклик на gp:outline-erased для второй полилинии.


    Добавьте ее указатель на реактор к глобальной переменной *reactorsToRemove*, которая уже содержит один указатель на реактор.

  • AutoCAD удалит полилинии.


  • Запускается функция отклика gp:command-ended. Все плитки, связанные с указателями на реакторы, хранящимися в *reactorsToRemove*, удаляются.


  • Кроме глобальной переменной *reactorsToRemove* приложение также содержит глобальную переменную *polyToChange* которая хранит указатели на изменяемые полилинии. Две дополнительные глобальные переменные для приложения будут представлены позже на этом занятии.

    Темы:

    Реакция на вызываемые пользователем команды

    Хранение информации с реакторами

     


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