События в КОМПАС. Не приходит событие IDocumentFileNotify::DocumentFrameOpen

Автор aleras85, 07.10.22, 15:18:26

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

aleras85

Подписался на события приложения при подключении библиотеки, при событии приложения "создан документ", подписываюсь на события этого документа. События документа мне приходят (проверял на событиях типа "закрытие документа", "сохранение документа"), за исключением события DocumentFrameOpen. Я правильно понимаю, что на момент, когда мы открыли документ и уже видим например модель в графической области, то это событие уже должно было прийти?
Интересен еще тот факт, что в библиотеке со всеми событиями, созданной мастером, это сообщение получить тоже не удается.
Так как же его все-таки перехватить? Заранее спасибо.

Vi2

Только что проверил на V21 - это событие не приходит. По-видимому, это рудимент, эхо от старых событий.

aleras85

Спасибо, но как же тогда подписаться на события окна документа при его открытии?

Vi2

Я не совсем в курсе, но есть события приложения CreateDocument и OpenDocument, которые более важны чем ловля окна, которого может и не быть. Если нужно определять видимость, то есть событие приложения ChangeActiveDocument или события документа Activate/Deactivate.

aleras85

Чтобы подписаться на события окна документа, нужен указатель на это окно. Этот указатель как раз таки приходит вместе с событием DocumentFrameOpen, а иначе не ясно как его получить. Да, есть соответствующие функции интерфейса IKompasDocument, но не понятно, как его получить в обработчике события OpenDocument например.

Vi2

А в чём сложность? Есть приложение Компаса с событиями, есть документ с событиями, есть фреймы документа (DocumentFrames), где каждый фрейм с событиями. Вот и цепляешься к чему нужно.

У IDocumentFrame есть свойство Active, если интересует именно активное.

У нас сценарий такой: при старте библиотеки цепляемся к событиям приложения Компаса. При открытии/создании документа цепляемся к событиям документа и сразу же цепляемся к событиям активного фрейма. Возможно, существуют разные окна документа, тогда и придёт то забытое событие DocumentFrameOpen, но у меня не хватает масла так сделать.

aleras85

Сложность вот в чем:
Как мы понимаем что окно открыто? Приходит событие, и мы это событие обрабатываем. В этом событии нам нужно подписаться на события документа и сразу на события окна документа. Подписаться на события документа мы можем запросто, для этого нужен reference на документ, он нам дан (приходит с событием открытия документа в параметрах). А подписаться на события окна документа мы не можем, для этого нужен сам фрейм в каком-либо виде, он нам не дан (не приходит с событием открытия окна документа в параметрах, а приходит только в событии DocumentFrameOpen)

Можно конечно кастомизировать обработчик событий приложения, передав ему в конструкторе IApplicationPtr и брать оттуда необходимую информацию, но такое решение выглядит несколько костыльно.

Vi2

Я могу предположить, что либо это событие неактуально вообще, либо это событие придёт при создании другого, отличного от основного, окна.

Из документа легко получить его фреймы, вот так у нас делается:
IDocumentFramePtr GetActiveFrame(IKompasDocumentPtr & doc)
{
IDocumentFramePtr res;

if (doc)
{
IDocumentFramesPtr frames(doc->DocumentFrames);
if (frames)
{
IDocumentFramePtr next;
for (long i = 0, count = frames->Count; i < count; i++)
{
next = frames->Item[i];
if ((bool)next && next->Active)
{
res = next;
break;
}
}
}
}

return res;
}
+ Благодарностей: 1