Тема: Реактор AcDbObjectReactor на AcDbBlockTable

Нужно отловить событие создания нового блока и узнать его имя. Я повесил AcDbObjectReactor на AcDbBlockTable и в AcDbObjectReactor::openedForModify() запоминаю список имен блоков ДО, а в AcDbObjectReactor::modified() расчитываю получить список блоков ПОСЛЕ создания нового, но эти списки оказываются равны. Т.е. новое имя в таблице появляется где-то позже. Пробовал проверять в AcDbObjectReactor::objectClosed() - та же  ерунда, новое имя не появляется. как узнать имя нового блока ?

Re: Реактор AcDbObjectReactor на AcDbBlockTable

Кажется можно сделать через AcDbDatabaseReactor::objectAppended() и проверкой в ней что  dbObj - это
AcDbBlockTableRecord ?

Re: Реактор AcDbObjectReactor на AcDbBlockTable

Кажется можно сделать через AcDbDatabaseReactor::objectAppended() и проверкой в ней что dbObj — это
AcDbBlockTableRecord ?

Можно. А в чем проблема?

Re: Реактор AcDbObjectReactor на AcDbBlockTable

Проблема в следующем: находясь в objectAppended() и узнав о том, что это
AcDbBlockTableRecord попытался выполнить над составом этой блоковой записи wblockCloneObjects(). Получил es= eWasOpenForRead; Очевидно AcDbBlockTableRecord открыта и не дает сделать wblockCloneObjects. Вопрос откуда тогда можно запустить wblockCloneObjects ???

Re: Реактор AcDbObjectReactor на AcDbBlockTable

Ну например отсюда:

AcEditorReactor::commandWillStart
AcEditorReactor::commandEnded

Re: Реактор AcDbObjectReactor на AcDbBlockTable

Наверное не совсем то, блок ведь может быть создан и например каким-нибудь arx-приложением.

Re: Реактор AcDbObjectReactor на AcDbBlockTable

Тогда объясни логику работы своего приложения.

Re: Реактор AcDbObjectReactor на AcDbBlockTable

У меня одновременно редактируется несколько чертежей, между которыми можно переключаться Ctrl+Tab. Если в одном из них создается новый блок, то во всех остальных должно также появиться определение этого нового блока в таблице. Причем блок не обязательно может создаваться коммандами "Block" или "Insert", но может и другими ARX-приложениями,т.е. через new AcDbBlockTableRecord (); В идеале сделать бы еще реактор на любое изменение блока (например сменили цвет линии внутри блока), приводящий к "апдейту" определений во всех чертежах.

Re: Реактор AcDbObjectReactor на AcDbBlockTable

> Sergei
В реакторах имеет смысл отмечать сам факт добавления/изменения AcDbBlockTableRecord. А вот синхронизацию с другими чертежами следует делать не моментально а в момент простоя AutoCAD. Например, после завершения очередной команды (т.е. AcEditorReactor::commandEnded) или lisp-функции (AcEditorReactor::lispEnded) или просто в момент простоя (AcEdInputContextReactor::beginQuiescentState)

Re: Реактор AcDbObjectReactor на AcDbBlockTable

Спасибо, учту обязательно.