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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 07-11-2019, 22:01:09

Название: Распараллелить работу двух команд
Отправлено: Atomohod от 07-11-2019, 22:01:09
Здравствуйте!

У меня просьба пользователя написать авторегенератор для Acad 2015, чтобы он реагировал на все действия в чертеже и запускал Regen All. Рассматриваю стандартный  new Timer(MyMethod, null, 1000, Timeout.Infinite). Но, если я это делаю как команду внутри dll, то получается что она активна весь сеанс работы с чертежом и блокирует возможность вызова других команд. Есть идеи как можно написать регенератор без такого эффекта?
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 07-11-2019, 22:34:45
Atomohod,
У меня нет слов. Видимо ты не понимаешь к чему это приведёт.
Название: Re: Распараллелить работу двух команд
Отправлено: Atomohod от 07-11-2019, 23:19:22
У меня нет слов. Видимо ты не понимаешь к чему это приведёт.
Может быть действительно не понимаю. Как тогда возможно реализовать авторегенерацию? И возможно ли? В новых версиях Автокада она же как-то реализована и притом "из коробки". На счет любого действия с чертежом я может некорректно выразился - подразумевается масштабирование и вставка/модификация графических примитивов пользователем.
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 07-11-2019, 23:22:23
В новых версиях Автокада она же как-то реализована и притом "из коробки".
Она во всех версиях (как минимум в последних 25) есть. REGENMODE установи в 1
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 07-11-2019, 23:26:06
На счет любого действия с чертежом я может некорректно выразился - подразумевается масштабирование и вставка/модификация графических примитивов пользователем.
Совершенно некорректно. И кроме того в насыщенных чертежах операция регенерации может длится несколько минут (сравнимо со временем открытия такого чертежа). Как ты себе представляешь работу с чертежом, если вдруг у тебя запустится регенерация, которая будет столь продолжительна? И про распараллеливание ты ерунду написал. Пока регенерация не закончится ты с чертежом делать ничего не сможешь.
Название: Re: Распараллелить работу двух команд
Отправлено: Atomohod от 07-11-2019, 23:50:47
И про распараллеливание ты ерунду написал.
Вот здесь я реально не понял - ясное дело что пока команда активна я не могу работать с чертежом. Так как я запускаю команду и она работает внутри сессии либо с интервалом либо при срабатывании события, то получается что она активна и запустить что либо я не могу - в этом и есть проблема. Однако есть точно такая же ситуация с Autosave - в настройках ставится интервал и через него регулярно идет автосохранение. И да - в момент автосохранения приложение виснет на пару сек. Если все просто решается установкой переменной, то для чего пользователю доступны целых две кнопки Regen и Regen all? Я запутался.
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 07-11-2019, 23:55:02
Однако есть точно такая же ситуация с Autosave - в настройках ставится интервал и через него регулярно идет автосохранение.
Нет. Автосохранение выполняется только в период простоя AutoCAD, когда он не выполняет никаких действий.
Название: Re: Распараллелить работу двух команд
Отправлено: Atomohod от 07-11-2019, 23:55:23
Переменная у меня REGENMODE =1, но линии все равно деградируют например круг становится ломаным, при масштабировании. Это и нужно убрать
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 07-11-2019, 23:57:30
Если все просто решается установкой переменной, то для чего пользователю доступны целых две кнопки Regen и Regen all?
Не всё. Регенерация выполняется тогда, когда AutoCAD считает, что без неё обойтись нельзя.
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 00:02:39
whiparc установи в 1
Название: Re: Распараллелить работу двух команд
Отправлено: Atomohod от 08-11-2019, 00:04:32
Насчет версий нашел в рекламе Acad 2016 от представителя Autodesk с которым работали-"Если на компьютере установлена видеокарта, поддерживающая DirectX 11 и включено аппаратное ускорение, то можно будет увидеть, насколько изменена обработка кривых и весов линий. Мало того - теперь REGENMODE до конца отрабатывает свое название и полностью регулирует режим регенерации модели." Если ему верить, то раньше этого не было.
Название: Re: Распараллелить работу двух команд
Отправлено: Atomohod от 08-11-2019, 00:09:12
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 00:09:17
Atomohod,
Это я комментировать не буду. При включении аппаратного ускорения бывают такие артефакты, что я предпочитаю его отключать.
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 00:10:30
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.
Пользователь сам должен принимать решение выполнять регенерацию или нет.
Название: Re: Распараллелить работу двух команд
Отправлено: Привалов Дмитрий от 08-11-2019, 11:51:28
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.
А какая версия AutoCAD, видеокарта, и какое имя драйвера в настройках AutoCAD?
Интересно что за глючное железо приводит к таким проблемам?
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 11:55:08
Интересно что за глючное железо приводит к таким проблемам?
Это вполне нормальное поведение, когда для показа изображения требуется регенерация.
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 12:05:36
Atomohod,
Воспользуйся командой НАСТРВИД (_VIEWRES) для настройки "гладкости" дуг/окружностей.
Название: Re: Распараллелить работу двух команд
Отправлено: Дмитрий Загорулькин от 08-11-2019, 12:10:09
Здравствуйте!

У меня просьба пользователя написать авторегенератор для Acad 2015, чтобы он реагировал на все действия в чертеже и запускал Regen All. Рассматриваю стандартный  new Timer(MyMethod, null, 1000, Timeout.Infinite). Но, если я это делаю как команду внутри dll, то получается что она активна весь сеанс работы с чертежом и блокирует возможность вызова других команд. Есть идеи как можно написать регенератор без такого эффекта?

Если абстрагироваться от того, что конечная цель вызывает недоумение и много вопросов, и сосредоточиться только на реализации, то я бы сделал примерно так:
1. Запускаем команду "Начать авторегенерацию".
2. В этой команде подписываемся на нужные события: добавление объектов в чертёж, модификацию объектов и т.д. и т.п.
3. Плюс подписываемся на событие Application.Idle.
После этого команда завершается и остаются работать в фоне только подписки на события. То есть, блокировки для других команд не будет.
4. При срабатывании любого из событий из п.2 включается обработчик, задача которого просто изменить флаг состояния. У флага два состояния. Одно - регенерация не нужна, второе - регенерация требуется. По умолчанию - первое состояние, а когда срабатывает интересующее событие - переключаем на второе состояние.
5. При срабатывании Application.Idle проверяем состояние флага из п.4. Если требуется регенерация - запускаем её. Флаг сбрасываем на начальное состояние.
Ну и, по-хорошему, нужна ещё одна команда - "Закончить авторегенерацию", которая отключает события из п. 2-3. Это когда пользователь осознает масштаб трагедии и захочет вернуть всё в исходное состояние :)
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 12:14:03
Это когда пользователь осознает масштаб трагедии и захочет вернуть всё в исходное состояние
Я думаю, что на этом можно будет остановиться. :)
Название: Re: Распараллелить работу двух команд
Отправлено: Дмитрий Загорулькин от 08-11-2019, 12:33:05
Ну иногда чтобы понять что-то, нужно самому прыгнуть на грабли. Пока этого не сделаешь, все доводы кажутся неубедительными. А так, в плане реализации, задачка-то интересная. И полезна для освоения работы с событиями. И пользователь может быть поймёт, что надо быть осторожнее со своими желаниями :)
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 12:38:55
Ну иногда чтобы понять что-то, нужно самому прыгнуть на грабли. Пока этого не сделаешь, все доводы кажутся неубедительными. А так, в плане реализации, задачка-то интересная. И полезна для освоения работы с событиями. И пользователь может быть поймёт, что надо быть осторожнее со своими желаниями :)
Пока Atomohod будет работать с чертежами, в которых регенерация занимает пару секунд всё будет более-менее нормально. Но как только попадётся реальный чертеж, требующий для регенерации даже несколько десятков секунд, как от этой "авторегенерации" будет достаточно непросто избавится. А про чертежи, в которых регенерация длится несколько минут (а то и десятков минут) я совсем молчу. 
Название: Re: Распараллелить работу двух команд
Отправлено: Дмитрий Загорулькин от 08-11-2019, 13:07:40
Если всё сделать аккуратно, то авторегенерация не будет настолько злобной, что её даже отключить нельзя будет. На крайний случай - диспетчер задач поможет  ;D
А так - пусть пробует, развлекается. Почему нет? :)
Название: Re: Распараллелить работу двух команд
Отправлено: Привалов Дмитрий от 08-11-2019, 22:52:09
Это вполне нормальное поведение, когда для показа изображения требуется регенерация.
Вдобавок постоянно автокад не дает перемещать чертеж, обрубая рамки окна и пока не выполнишь regen - картинку не сдвинуть.
для показа да, но когда заблокировано перемещение по чертежу, это странно.
Название: Re: Распараллелить работу двух команд
Отправлено: Привалов Дмитрий от 08-11-2019, 23:39:18
Если всё сделать аккуратно, то авторегенерация не будет настолько злобной
Пользователь сам должен принимать решение выполнять регенерацию или нет.
В ряде сценариев выполнение регенерации без участия пользователя полезно.

Например после завершения некоторых команд: вставка-регенерация, очистка-регенерация. При условии, что пользователю нужно вызвать ее, чтобы увидеть результат и продолжить работу.
И после смены масштаба, т.к. для отображения типов линий нужно выполнить регенерацию. Главное, что это не очень частое событие.

В остальном Александр прав, что использовать авторегенерацию не стоит из-за проблемных чертежей и возможной потери времени.
Название: Re: Распараллелить работу двух команд
Отправлено: Александр Ривилис от 08-11-2019, 23:53:57
В ряде сценариев выполнение регенерации без участия пользователя полезно.

Например после завершения некоторых команд: вставка-регенерация, очистка-регенерация. При условии, что пользователю нужно вызвать ее, чтобы увидеть результат и продолжить работу.
И после смены масштаба, т.к. для отображения типов линий нужно выполнить регенерацию. Главное, что это не очень частое событие.
Полностью согласен. Но тут достаточно вызвать регенерацию в конце выполнения своей команды. Но если на каждый чих будет выполнятся регенерация - это перебор.