Действительно, все получилось сделать:
- создать связи
- сохранить связи в чертеже
- восстановить и актуализировать информацию при открытии чертежа
- отловить событие копирования связанных объектов внутри чертежа и добавить связь копиям
- отловить событие модификации связанных объектов и сгенерировать события для того, чтобы приложение, пользующееся функционалом связей, могло каким-то образом на это отреагировать
Но вот через буфер обмена никак не получается пробиться. Загвоздка в том, что такое копирование как-то хитро работает. Как показывают опыты, при этом создается в папке Temp временный чертеж (частичная копия исходного чертежа?), из которой уже объекты переносятся в чертеж назначения. Какие я только события не пробовал (Database.BeginDeepClone, Database.BeginDeepCloneTranslation, Database.BeginWblockEntireDatabase, Database.BeginWblockObjects, Database.BeginWblockSelectedObjects, Database.BeginDxfOut, Database.WblockMappingAvailable, Database.WblockNotice, Database.BeginWblockBlock) - создание временного чертежа никак не отлавливается.
При Ctrl+C возникает только событие WblockNotice, которое имеет в аргументах ссылку на базу данных исходного чертежа (непонятно зачем, ведь аргумент sender - это та же самая база данных).
При Ctrl+V в другом чертеже, срабатывают уже события базы данных того чертежа, в который вставляем - BeginDeepClone и BeginDeepCloneTranslation. В их аргументах OriginalDatabase - БД временного файла из Temp, DestinationDatabase - база данных чертежа, в который копируем. При этом, в NOD базы данных временного файла нет данных о ссылках, хотя в базе данных исходного чертежа в NOD эти данные есть.
Поэтому, теперь меня волнуют два вопроса:
- Все ли правильно с событием WblockNotice? Может быть, в аргументах там должна фигурировать еще и вторая база данных?
- Может быть, есть какое-то еще событие базы данных/документа/приложения/системы, чтобы можно было отловить копирование объектов через буфер обмена?
Буду благодарен, если кто-нибудь поможет с этим!