Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Sergey_K от 01-04-2020, 17:30:01

Название: Redraw
Отправлено: Sergey_K от 01-04-2020, 17:30:01
При предварительном выборе объектов с помощью полигона (и лассо) или секущего полигона (лассо) всегда выполняется перерисовка экрана (redraw).
Как отловить событие "redraw" ?
(регенерация ловится, например, с помощью AcGiDrawableReactor::endRegen или AcEditorReactor3::fullRegenEnded)
Название: Re: Redraw
Отправлено: Александр Ривилис от 01-04-2020, 19:36:55
Как отловить событие "redraw" ?
Ну вообще-то такого события в AutoCAD API нет. Разве что ловить через Windows API.
Название: Re: Redraw
Отправлено: Александр Ривилис от 01-04-2020, 19:42:00
При предварительном выборе объектов с помощью полигона или секущего полигона всегда выполняется перерисовка экрана (redraw).
Сама выполняется? Это мягко говоря крайне странно...
Название: Re: Redraw
Отправлено: Sergey_K от 01-04-2020, 20:00:12
Это мягко говоря крайне странно...
Сама. Странно что событие нельзя определить.
Более странно что при выборе "window" "cross window" "fence" этого не происходит
Название: Re: Redraw
Отправлено: Александр Ривилис от 01-04-2020, 20:03:55
Sergey_K,
Я не проверял работоспособность, но есть такая функция: acgsSetCustomUpdateMethod
Попробуй поиграться с ней.
Название: Re: Redraw
Отправлено: Александр Ривилис от 01-04-2020, 20:35:44
Это мягко говоря крайне странно...
Сама. Странно что событие нельзя определить.
Более странно что при выборе "window" "cross window" "fence" этого не происходит

У меня не подтверждается, или я что-то не понял:
Название: Re: Redraw
Отправлено: Sergey_K от 01-04-2020, 20:55:38
У меня не подтверждается

Каким образом проверяется подтверждение? Это можно проверить только с помощью acedGrDraw и acedGrVecs

есть такая функция: acgsSetCustomUpdateMethod

Код - C++ [Выбрать]
  1. bool ret = acgsSetCustomUpdateMethod((acgsCustomUpdateMethod) &updateMethod, nullptr);
Функция updateMethod просто не вызывается...
Название: Re: Redraw
Отправлено: Александр Ривилис от 01-04-2020, 21:07:16
Каким образом проверяется подтверждение? Это можно проверить только с помощью acedGrDraw и acedGrVecs
Ты начал не оттуда. Тебе нужно чтобы по окончанию выбора на экране сохранились (или перерисовались) нарисованные тобой объекты? Ну тогда просто в реакторе AcEdInputContextReactor::endSSGet перерисуй их по новой, при необходимости запустив acedRedraw (или даже acgsRemoveAnonymousGraphics)
Название: Re: Redraw
Отправлено: Sergey_K от 01-04-2020, 21:59:17
просто в реакторе AcEdInputContextReactor::endSSGet перерисуй их

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

Нужно переопределить метод onPaint Autocad, это будет наверняка. Только как до него добраться пока не знаю
Название: Re: Redraw
Отправлено: Александр Ривилис от 01-04-2020, 22:31:51
Не так уж и просто. endSSGet  вызывается только при изменении текущего выбора, а redraw выполняется вне зависимости от того был изменён выбор или нет. Так что не годится этот способ.
Попробуй AcEdInputContextReactor::beginQuiescentState
Нужно переопределить метод onPaint Autocad, это будет наверняка. Только как до него добраться пока не знаю
Не думаю, что нужно его переопределять. Попробуй сначала отловить для этого окна WM_PAINT при помощи или acedRegisterFilterWinMsg или acedRegisterWatchWinMsg
Название: Re: Redraw
Отправлено: Sergey_K от 01-04-2020, 22:59:26
beginQuiescentState - много лишних срабатываний. При любом вводе с командной строки
acedRegisterFilterWinMsg или acedRegisterWatchWinMsg
Вот это скорей оно.
Название: Re: Redraw
Отправлено: Александр Ривилис от 01-04-2020, 23:10:04
beginQuiescentState - много лишних срабатываний. При любом вводе с командной строки
WM_PAINT будет срабатывать еще чаще.
Название: Re: Redraw
Отправлено: Sergey_K от 02-04-2020, 14:26:30
WM_PAINT для текущего окна документа и будет событие "redraw"
Нужно определить HWND для acDocManager->curDocument() и задача будет решена
Название: Re: Redraw
Отправлено: Александр Ривилис от 02-04-2020, 14:32:18
WM_PAINT для текущего окна документа и будет событие "redraw"
Нужно определить HWND для acDocManager->curDocument() и задача будет решена

1. WM_PAINT не только для redraw.
2. AcApDocWindowManager::activeDocumentWindow даст AcApDocWindow, у которого есть свойство windowHandle возвращающее HWND
Название: Re: Redraw
Отправлено: Александр Ривилис от 02-04-2020, 14:38:55
Альтернатива:  adsw_acadDocWnd()
Название: Re: Redraw
Отправлено: Sergey_K от 02-04-2020, 14:43:29
WM_PAINT не только для redraw

WM_PAINT, как я понимаю, для обновления экрана. Т.е. возможно срабатывание и для regen. Регенерация фиксируется реактором. Остаётся - redraw.
Для чего ещё?
Название: Re: Redraw
Отправлено: Александр Ривилис от 02-04-2020, 15:02:05
Для чего ещё?
Да любое изменение на экране (изменение примитивов, появление ручек и т.д.) должно вызывать WM_PAINT
Название: Re: Redraw
Отправлено: Sergey_K от 02-04-2020, 15:36:59
Да любое изменение на экране (изменение примитивов, появление ручек и т.д.) должно вызывать WM_PAINT
Должно, но не обязано.
WM_PAINT вызывается только при изменении размеров окна документа. В остальных случаях видимо действует внутренняя система сообщений adsk, по этому, выходит, что ловить событие redraw с помощью стандартного обработчика событий - занятие бесперспективное.
В консерватории нужно что то менять или иметь доступ к системе сообщений adsk
Название: Re: Redraw
Отправлено: Александр Ривилис от 02-04-2020, 15:50:10
Sergey_K,
Значит у тебя остаётся AcEdInputContextReactor::beginQuiescentState - нормальное место для отрисовки временной графики. Ну или использовать AcGiDrawableOverrule
Название: Re: Redraw
Отправлено: Sergey_K от 02-04-2020, 16:10:47
остаётся AcEdInputContextReactor::beginQuiescentState - нормальное место для отрисовки временной графики
Если отфильтровать ненужные срабатывания на ввод из командной строки - возможно. Остаётся определиться, с командной строкой