Redraw

Автор Тема: Redraw  (Прочитано 7933 раз)

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

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Redraw
« : 01-04-2020, 17:30:01 »
При предварительном выборе объектов с помощью полигона (и лассо) или секущего полигона (лассо) всегда выполняется перерисовка экрана (redraw).
Как отловить событие "redraw" ?
(регенерация ловится, например, с помощью AcGiDrawableReactor::endRegen или AcEditorReactor3::fullRegenEnded)
« Последнее редактирование: 01-04-2020, 22:31:16 от Sergey_K »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #1 : 01-04-2020, 19:36:55 »
Как отловить событие "redraw" ?
Ну вообще-то такого события в AutoCAD API нет. Разве что ловить через Windows API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #2 : 01-04-2020, 19:42:00 »
При предварительном выборе объектов с помощью полигона или секущего полигона всегда выполняется перерисовка экрана (redraw).
Сама выполняется? Это мягко говоря крайне странно...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #3 : 01-04-2020, 20:00:12 »
Это мягко говоря крайне странно...
Сама. Странно что событие нельзя определить.
Более странно что при выборе "window" "cross window" "fence" этого не происходит

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #4 : 01-04-2020, 20:03:55 »
Sergey_K,
Я не проверял работоспособность, но есть такая функция: acgsSetCustomUpdateMethod
Попробуй поиграться с ней.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #5 : 01-04-2020, 20:35:44 »
Это мягко говоря крайне странно...
Сама. Странно что событие нельзя определить.
Более странно что при выборе "window" "cross window" "fence" этого не происходит

У меня не подтверждается, или я что-то не понял:
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #6 : 01-04-2020, 20:55:38 »
У меня не подтверждается

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

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

Код - C++ [Выбрать]
  1. bool ret = acgsSetCustomUpdateMethod((acgsCustomUpdateMethod) &updateMethod, nullptr);
Функция updateMethod просто не вызывается...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #7 : 01-04-2020, 21:07:16 »
Каким образом проверяется подтверждение? Это можно проверить только с помощью acedGrDraw и acedGrVecs
Ты начал не оттуда. Тебе нужно чтобы по окончанию выбора на экране сохранились (или перерисовались) нарисованные тобой объекты? Ну тогда просто в реакторе AcEdInputContextReactor::endSSGet перерисуй их по новой, при необходимости запустив acedRedraw (или даже acgsRemoveAnonymousGraphics)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #8 : 01-04-2020, 21:59:17 »
просто в реакторе AcEdInputContextReactor::endSSGet перерисуй их

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

Нужно переопределить метод onPaint Autocad, это будет наверняка. Только как до него добраться пока не знаю

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #9 : 01-04-2020, 22:31:51 »
Не так уж и просто. endSSGet  вызывается только при изменении текущего выбора, а redraw выполняется вне зависимости от того был изменён выбор или нет. Так что не годится этот способ.
Попробуй AcEdInputContextReactor::beginQuiescentState
Нужно переопределить метод onPaint Autocad, это будет наверняка. Только как до него добраться пока не знаю
Не думаю, что нужно его переопределять. Попробуй сначала отловить для этого окна WM_PAINT при помощи или acedRegisterFilterWinMsg или acedRegisterWatchWinMsg
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #10 : 01-04-2020, 22:59:26 »
beginQuiescentState - много лишних срабатываний. При любом вводе с командной строки
acedRegisterFilterWinMsg или acedRegisterWatchWinMsg
Вот это скорей оно.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #11 : 01-04-2020, 23:10:04 »
beginQuiescentState - много лишних срабатываний. При любом вводе с командной строки
WM_PAINT будет срабатывать еще чаще.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #12 : 02-04-2020, 14:26:30 »
WM_PAINT для текущего окна документа и будет событие "redraw"
Нужно определить HWND для acDocManager->curDocument() и задача будет решена

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #13 : 02-04-2020, 14:32:18 »
WM_PAINT для текущего окна документа и будет событие "redraw"
Нужно определить HWND для acDocManager->curDocument() и задача будет решена

1. WM_PAINT не только для redraw.
2. AcApDocWindowManager::activeDocumentWindow даст AcApDocWindow, у которого есть свойство windowHandle возвращающее HWND
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #14 : 02-04-2020, 14:38:55 »
Альтернатива:  adsw_acadDocWnd()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #15 : 02-04-2020, 14:43:29 »
WM_PAINT не только для redraw

WM_PAINT, как я понимаю, для обновления экрана. Т.е. возможно срабатывание и для regen. Регенерация фиксируется реактором. Остаётся - redraw.
Для чего ещё?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #16 : 02-04-2020, 15:02:05 »
Для чего ещё?
Да любое изменение на экране (изменение примитивов, появление ручек и т.д.) должно вызывать WM_PAINT
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #17 : 02-04-2020, 15:36:59 »
Да любое изменение на экране (изменение примитивов, появление ручек и т.д.) должно вызывать WM_PAINT
Должно, но не обязано.
WM_PAINT вызывается только при изменении размеров окна документа. В остальных случаях видимо действует внутренняя система сообщений adsk, по этому, выходит, что ловить событие redraw с помощью стандартного обработчика событий - занятие бесперспективное.
В консерватории нужно что то менять или иметь доступ к системе сообщений adsk

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Redraw
« Ответ #18 : 02-04-2020, 15:50:10 »
Sergey_K,
Значит у тебя остаётся AcEdInputContextReactor::beginQuiescentState - нормальное место для отрисовки временной графики. Ну или использовать AcGiDrawableOverrule
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Redraw
« Ответ #19 : 02-04-2020, 16:10:47 »
остаётся AcEdInputContextReactor::beginQuiescentState - нормальное место для отрисовки временной графики
Если отфильтровать ненужные срабатывания на ввод из командной строки - возможно. Остаётся определиться, с командной строкой