Свободные Jigs

Автор Тема: Свободные Jigs  (Прочитано 22789 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #15 : 31-01-2015, 00:04:38 »
Тем, что я могу быть подписан на отмену команд. И при этом я сам освобождаю используемые мной ресурсы, подписки на события и т.д. И вот мне прилетает отмена, которая вообще непонятно почему возникла. Да, обойти это можно, но это странное поведение.
Почему же непонятно почему прилетит? Нажал "Отмена" в диалогов окне - вот тебе и результат. Кстати это общая логика команд AutoCAD. Если ты сделаешь свою логику поведения, которая будет идти вразрез с общей логикой, то не думаю что пользователи обрадуются.
Вообще-то если мне не изменяет память в действительности ничего не "прилетает", т.е. вызов acedCommandCancelled не приводит к генерации события CommandCanceled.
я не думаю, что реверс-инженеринг актуален для большинства разработчиков
Безусловно. Я это написал только для того, чтобы ты сам мог проанализировать код в AutoCAD 2015, если он тебя интересует.
ну есть сервис паки и т.д.
В SP Autodesk исправляет ошибки, но не меняет логику поведения. Так что на это расчитывать не советую. Поверь моему 25-летнему опыту.
Кому его отсылать? Я могу и напрямую разработчикам написать, проблем с переводом техн. английского у меня нет.
Ну если у тебя есть прямая связь с разработчиками - то шли им. Если нет, то пиши здесь. Я передам как пожелание. Но не забудь про все три пункта - без них Autodesk не будет рассматривать твоё пожелание.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #16 : 31-01-2015, 00:35:02 »
Вообще-то если мне не изменяет память в действительности ничего не "прилетает", т.е. вызов acedCommandCancelled не приводит к генерации события CommandCanceled.
Память не изменила. Сляпал быстренько тест на ObjectARX и включил в ARXDBG проверку на реакторы:
Код - C++ [Выбрать]
  1. static void MyGroupMyCommand1 () {
  2.     acedCommandCancelled();
  3. }
Команда: _MYCOMMAND1
[ED REACTOR]    : [Command Will Start: MYCOMMAND1]
[ED REACTOR]    : [Command Ended: MYCOMMAND1]
Если команда прерывается, то это выглядит так:
Команда: _MYCOMMAND1
[ED REACTOR]    : [Command Will Start: MYCOMMAND1] *Прервано*
[ED REACTOR]    : [Command Cancelled: MYCOMMAND1]
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Свободные Jigs
« Ответ #17 : 31-01-2015, 01:36:21 »
Здравствуйте. Можно и я влезу в Ваш диалог? Я, если честно, вообще не вижу ни одного реального случая когда в автокаде нужны именно диалоговые окна (то есть когда работают только оно одно) и могу привести бесконечное количество вариантов - когда несколько окон - на порядок удобней (с установленным флагом "всегда сверху" - TopMost). ИХМО диалоговое окно - это архаизм из времен DCL, "отловить" или заблокировать документ в "нужные" моменты оно-же как и спрятать и вернуть окно - никакой проблемы нет. Уж с чем - но только не с проблемами с окошками я не сталкивался. 

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #18 : 02-02-2015, 10:42:23 »
Нажал "Отмена" в диалогов окне - вот тебе и результат. Кстати это общая логика команд AutoCAD
Отмена в диалоговом окно может быть связана с отменой команды в частных случаях, но не обязана быть отменой для всех команд. Для любой нормальной архитектуры программы это выглядит как костыль, с которым потом еще нужно разбираться.  Я уверен, что это не критичный момент, раз все эти команды работают. Пускай внутри используют что хотят. Но для внешних разработок такие моменты должны быть под контролем внешнего разработчика.
Простой пример: та же вложенность форм в одной команде. Если использовать StartUserInteraction, то нужно вложенную схему преобразовать в линейную. А в линейной схеме диалоговая отмена в одной из форм логически может быть не связана с завершением команды. Впрочем, раз событие CommandCanceled не генерируется, то можно считать эту часть кода несущественной.
 
диалоговое окно - это архаизм из времен DCL
это просто самое эффективное средство из тех, что есть.
Обращу внимание на задачу. Выполняется интерактивная команда, в ходе которой не должно быть вызовов других команд из editor (самая простая возможность - взять конец отрезка и потянуть) или из командной строки. Это действительно важно.
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастика) Но пока я не могу это сделать.
В любом случае это все равно будет некий ограниченный диалог, только другого вида. Иначе вы не сможете гарантировать выполнение задачи или хотя бы ее поведение.

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #19 : 02-02-2015, 10:51:22 »
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастика
есть идея по натягиванию 1% недиалогового wpf на autocad  с гибкой блокировкой в MessageFilter. Но пока не знаю, сколько времени это может занять и что за костыль в итоге выйдет, но для фана можно попробовать.
Минусы: примерно на 1% станет тусклее изображение.
Плюсы: можно легко использовать какие угодно контролы без transient graphics

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Свободные Jigs
« Ответ #20 : 02-02-2015, 22:34:32 »
Обращу внимание на задачу. Выполняется интерактивная команда, в ходе которой не должно быть вызовов других команд из editor (самая простая возможность - взять конец отрезка и потянуть) или из командной строки. Это действительно важно.
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастика) Но пока я не могу это сделать.
4 раза прочел - так и не понял... Еще раз - чего надо сделать?

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #21 : 02-02-2015, 22:58:59 »
чего надо сделать?
Чтобы при любых действиях в чертеже не вызывались стандартные команды. Это нужно для контроля состояния объекта. Например, при выполнении команды  переноса отрезка нельзя изменить его длину. После - пожалуйста, но не во время выполнения переноса.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #22 : 02-02-2015, 23:06:55 »
Чтобы при любых действиях в чертеже не вызывались стандартные команды. Это нужно для контроля состояния объекта. Например, при выполнении команды  переноса отрезка нельзя изменить его длину. После - пожалуйста, но не во время выполнения переноса.
Состояние объекта может быть изменено не только стандартными командами, но и например из Панели Свойств.
P.S.: Видимо и у меня и у Дима_ плохо с воображением и без видео нам не понять твоих задумок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #23 : 02-02-2015, 23:13:42 »
Состояние объекта может быть изменено не только стандартными командами, но и например из Панели Свойств.
Это отдельная задача, она легко отслеживается. Логика простая - запуск новой команды означает прекращение текущей. Неконтроллируемое изменение объекта(с точки зрения запущенной команды) также означает прекращение команды.

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #24 : 02-02-2015, 23:32:57 »
А "стандартными" средствами проконтролировать объект (или запретить его изменение).
Блокировка слоя не подходит из-за визуального ухудшения отображения. А других вариантов я не знаю. Без блокировки слоя изменение объекта можно только отследить, но не запретить.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #25 : 03-02-2015, 00:04:34 »
Без блокировки слоя изменение объекта можно только отследить, но не запретить.
Думаешь? Ну есть как минимум один способ запретить: ObjectOverrule
Небольшой пример: http://drive-cad-with-code.blogspot.com/2012/03/using-objectoverrule-to-prevent-entity.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #26 : 03-02-2015, 09:07:16 »
Небольшой пример: http://drive-cad-with-code.blogspot.com/2012/03/using-objectoverrule-to-prevent-entity.html
думаю любой, кто прочитает эту статью, найдет для себя хоть одну причину не использовать этот способ.
Я приведу пару причин из статьи:
1) выбрасывание unhandled exception
"There is one thing to be aware of with this "throw an exception" in overriden Open() method approach: you cannot test if your Overrule works or not in Visual Studio's' debugging mode. When the line of code that throws the exception runs, Visual Studio treats the exception as unhandled (as it should), thus the debuggung process stops. One can only test this type of Overrule in normal AutoCAD session without Visual Studio's debugging process attached.."
Будет ли Crash? Думаю, что если нечто неизвестное начало работать с объектом, безопаснее всего запомнить состояние этого объекта и позволить неизвестному сделать свое дело. После получения управления можно решить, что делать с этим объектом, оставить как есть или восстановить.
2) артефакты
"However, there is one thing that is annoying me: if I try to move the block, the block is simply disappeared on the screen. Although I can tel it is still there, but not visible, until I issue "REGEN" command. Of course, the block is still there, not moved, thanks to the Overrule"
Допустим, у меня тысячи объектов на чертеже. Как я вообще пойму, что этот объект стал невидимым? Это разве не изменение? По-моему защита не сработала.

Допустим все же использовать этот неуправляемый костыль и решить ряд проблем. Остается момент: есть команды, которые паразитно запускаются без наличия объектов. Вроде выделения области на чертеже. Да, объект не меняется, но новая команда запущена, а значит выполнение текущей должно быть прекращено.
Правильный выход - не допустить порождения команды действиями в чертеже. Без модальных окон и prompt/jig сейчас это невозможно или способ мне неизвестен.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #27 : 03-02-2015, 09:31:34 »
Допустим, у меня тысячи объектов на чертеже. Как я вообще пойму, что этот объект стал невидимым? Это разве не изменение? По-моему защита не сработала.
Код смотрел? Там вообще-то речь идет о блоке (точнее о вставке блока) и особенность именно из-за этого, а тебе нужно обработать все типы примитивов.
Правильный выход - не допустить порождения команды действиями в чертеже.
Правильный подход - использовать AutoCAD UI, а не изобретать свой.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #28 : 03-02-2015, 09:40:22 »
Есть еще один метод запретить команды - в DocumentCollection.DocumentLockModeChanged вызвать Veto.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #29 : 03-02-2015, 10:15:32 »
Код смотрел? Там вообще-то речь идет о блоке (точнее о вставке блока) и особенность именно из-за этого, а тебе нужно обработать все типы примитивов.
Ок, блок состоит из примитивов, атрибутов, чего-то возможно еще, тут мои знания ограничены. И по какой-то причине Move решил поработать с примитивами блока, а не с целым блоком.
Вы в состоянии перечислить сходу все типы примитивов, а также все другие возможные объекты, которые являются частью любого составного объекта?
Даже для существующего и известного объекта это сделать, узнать все его внутренности, будет непросто.
typeof (Entity) лучше не предлагать, на обычном зуме будет crash.

Правильный подход - использовать AutoCAD UI, а не изобретать свой.
ну так я  и предлагаю его использовать, разве нет? В самом Autodesk его используют. Они используют именно то, что я показывал на скриншотах. Тот же самый диалоговый/модальный подход с prompt/jig. Только без ограничений в виде ненужных типов ввода данных. Все связано с названием темы, а остальное - побочное. Не следует воспринимать всерьез использование прозрачного wpf окна поверх окна AutoCAD с прочей магией. Там же написано - "для фана".

Есть еще один метод запретить команды - в DocumentCollection.DocumentLockModeChanged вызвать Veto.
я его использую для override некоторых команд. Например для удаления, для Ctrl-C, Ctrl-V.
Проблема в том, что источник (откуда началась команда) неизвестен. Если из меню/по кнопке - Ок. Если действиями в чертеже - Нет.