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

       

Немедленная и задержанная передача событий


Для AcDbObjectReactor события уведомления могут или происходить немедленно или быть задержано на время. Используйте задержку, когда объект закрыт, если Вы работаете на основании " в объект ", или конец наиболее удаленной сделки, если Вы используете операционную модель. Следующие события посылают немедленное уведомление:

cancelled()

                Уведомление послано, когда AcDbObject::cancelled()

вызван.

openedForModify()

Уведомление послано перед первым вызовом функции модификации, прежде, чем состояние объекта изменено.

copied()

Уведомление послано, когда объект скопирован.

goodbye()

Уведомление послано, когда объект собирается быть удаленным из памяти.

Немедленные уведомления вызваны в то же самое время как соответствующее событие. Например, когда assertWriteEnabled () вызван первый раз на объекте, openedForModify () уведомление немедленно послано всем реакторам на том объекте.

Следующие события посланы с задержкой:

n modified()



n subObjModified()

n erased()

n modifyUndone()

n modifiedXData()

n unappended()

n reappended()

n graphicsModified()

modified() уведомление о AcDbObjectReactor - пример передавать-разового уведомления. Предположим, что объект открыт, и функция модификации - обратился к этому. Функция модификации вызывает assertWriteEnabled() и все реакторы получают openedForModify() реакция. Последующие функции модификации на объекте не приводят к любому дальнейшему уведомлению. Когда объект наконец закрыт, modified() уведомление послано. Однако, если новичок хотел называть cancel()

на объекте вместо cancelled(), cancel()

уведомление будет послано вместо cancelled() уведомление.

Когда Вы получаете задержанное уведомление типа modified(), один из параметров - указатель на объект. В это время объект находится в состоянии только для чтения. Вы не способны изменить это до конца совершающегося процесса.

При попытке изменять объект прежде, чем совершающийся процесс закончен, есть причины AutoCAD, чтобы прерваться с сообщением об ошибках eWasNotOpenForWrite или eInProcessOfCommitting.


Вы можете использовать следующие функции, чтобы проверить, что совершающийся процесс закончен прежде, чем Вы открываете объект для записи:

 AcDbObjectReactor::objectClosed(AcDbObjectId ObjId);

 AcTransactionReactor::transactionEnded(int NumActiveAndSuccessful);

ObjectClosed() уведомление послано, когда объект полностью закрыт и указатель больше не имеет силу. Вы можете открывать объект, снова использующий ID, который пропускают в параметре и работать на этом. Будьте внимательным, чтобы не создать бесконечные циклы уведомления в этой точке.

В transactionEnded() уведомление, Вы можете использовать numActiveTransactions(), чтобы сделать запрос операционного менеджера, чтобы видеть, сколько сделок активны. Если не имеется никаких активных сделок, то сделка закончилась, и все объекты в сделке были совершены.

Иногда Вы могут были должны знать, когда наиболее удаленная сделка заканчивается, и совершающийся процесс начинается. Используйте следующее уведомление для этой цели:

 AcTransactionReactor::endCalledOnOutermostTransaction()

Когда наиболее удаленные операционные концы, совершающийся процесс начинается и close() обратился к каждому объекту. Вы могли бы получать objectClosed() уведомление как часть этого завершения. Однако, вообще лучше всего не действовать немедленно.

Вместо этого, ждите, пока целая сделка не закончена прежде, чем Вы исполняете любые операции на этих объектах.


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