Свободные Jigs

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

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

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Свободные Jigs
« : 30-01-2015, 15:19:44 »
Здравствуйте.
Опишу проблемы. Использую AutoCAD 2013 и 2014 Я создаю какую-то команду. При вызове команды происходит примерно следующее: появляется модальная форма с кнопками. По кнопке вызываю jig, что-то делаю и возвращаюсь на форму. И так может быть сколько угодно раз. Все время сохраняется диалоговый режим. Что при этом получается:
1) забивается командная строка от jigs. Она может очиститься либо при завершении jig c выходом через Esc, либо при закрытии формы. Очень часто такие варианты невозможны из-за логики действий.
2) если jig завершается например выбором точки, то при возврате к модальной форме на графике остается "след" от сообщения jig. Это выглядит неприятно для пользователя.
3) часто используется интерактивное взаимодействие с объектами: выбор, подсветка, что-нибудь с transient graphic. Все что мне нужно это в диалоговом режиме водить курсором и получать информацию об объектах. Из функционала  jig я использую только выбор точки, но и он мне не нужен, часто информация о вводе точки - лишняя. Дополнительную информацию я получаю от  PointMonitor и MessageFilter. С использованием transient graphic я могу и сам нарисовать, что угодно и контролировать ввод данных. Проблема в том, что я не могу отключить текущий ввод (ввод точки).

Соответственно, вопросы:
1) Можно ли средствами .net управлять командной строкой: очищать вывод, блокировать вывод. Очистку экспериментально удалось сделать путем вызова двух пустых jig и пробрасывания esc, но это жуткий костыль) и вызывает задержку.
2) Можно ли каким-либо способом задать диалоговый режим с чертежем, чтобы: а) работал PointMonitor б) работала Transient Graphic в) прерывание как jig (через Esc или вызов команды в меню/интерфейсе) г) без лишнего ввода информации как в jig

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #1 : 30-01-2015, 15:36:34 »
Приветствую на форуме!
Увы, но я ничего не понял. Хотя бы видео запиши ( https://screencast.autodesk.com ), чтобы было понятно о чем ты пишешь.
Что касается восстановления командной строки, то Editor.PostCommandPrompt должен помочь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #2 : 30-01-2015, 16:00:10 »
По кнопке вызываю jig, что-то делаю и возвращаюсь на форму.
Про Editor.StartUserInteraction надеюсь не забываешь? Пример использования здесь: http://adndevblog.typepad.com/autocad/2012/05/taking-mouse-inputs-from-a-modal-dialog-box.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #3 : 30-01-2015, 16:26:41 »
Что касается восстановления командной строки, то Editor.PostCommandPrompt должен помочь.
Autodesk.AutoCAD.Internal.Utils.PostCommandPrompt() помогает

Про Editor.StartUserInteraction надеюсь не забываешь? Пример использования здесь: http://adndevblog.typepad.com/autocad/2012/05/taking-mouse-inputs-from-a-modal-dialog-box.html
я в ShowDialog Handle главного окна устанавливаю, никаких ошибок в связи с этим еще не ловил.

По поводу видео чуть позже, но я думаю смысл можно уловить при использовании стандартной команды Подобие (смещение).
Ввели смещение, выбрали объект. И вот тут начинается то, что хотелось бы иметь в своих решениях. Точка выбирается, но скрыт ввод координат, а вместо этого можно ввести новое смещение. Так вот, мне каким-то образом нужно точно так же скрыть ввод координат.

 

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #4 : 30-01-2015, 16:32:27 »
я в ShowDialog Handle главного окна устанавливаю, никаких ошибок в связи с этим еще не ловил.
Не понял. Ты показываешь диалог в AutoCAD не при помощи Application.ShowModalDialog, а при помощи Form.ShowDialog? Ну тогда большинство проблем у тебя именно от этого...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #5 : 30-01-2015, 17:09:46 »
Не понял. Ты показываешь диалог в AutoCAD не при помощи Application.ShowModalDialog, а при помощи Form.ShowDialog? Ну тогда большинство проблем у тебя именно от этого...
Это работает пока одна форма, а если я в форме по кнопке создаю еще одну форму? При StartUserInteraction на второй форме выдает Exception "NotActiveWindow". Допустим, это можно разрулить засчет архитектуры кода, чтобы не было вложенности вызова форм.
Но есть еще одна проблема: пусть я начал использовать StartUserInteraction, но понял, что не хочу использовать текущую команду и вызвал другую. В этот момент я не хочу, чтобы у меня появилось скрытое окно, а высвободить ресурсы, отписаться от событий и перейти к функционалу новой команды. В случае с StartUserInteraction окно появится, а без него - я могу этим управлять.

Сейчас это не самая критичная штука, все же с этим можно жить, хоть и неудобно. Второй вопрос более актуален.

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #6 : 30-01-2015, 17:22:57 »
Это работает пока одна форма, а если я в форме по кнопке создаю еще одну форму? При StartUserInteraction на второй форме выдает Exception "NotActiveWindow".
Из вложенной формы к редактору AutoCAD ты не достучишься. Еще раз. Использовать Form.ShowDialog в AutoCAD нельзя. Это аксиома.
Но есть еще одна проблема: пусть я начал использовать StartUserInteraction, но понял, что не хочу использовать текущую команду и вызвал другую. В этот момент я не хочу, чтобы у меня появилось скрытое окно, а высвободить ресурсы, отписаться от событий и перейти к функционалу новой команды. В случае с StartUserInteraction окно появится, а без него - я могу этим управлять.
Без него ты не имеешь права обращаться к редактору (Editor). Ну, т.е. если хочешь видеть эти артефакты и шансы развалить AutoCAD - то пожалуйста используй.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #7 : 30-01-2015, 17:25:17 »
2) Можно ли каким-либо способом задать диалоговый режим с чертежем, чтобы: а) работал PointMonitor б) работала Transient Graphic в) прерывание как jig (через Esc или вызов команды в меню/интерфейсе) г) без лишнего ввода информации как в jig
Если это второй вопрос, то я его не понял. Или объясни так, как я сказал (код, видео). Ну или жди - может кто-нибудь сможет тебя понять.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #8 : 30-01-2015, 20:06:54 »
Из вложенной формы к редактору AutoCAD ты не достучишься. Еще раз. Использовать Form.ShowDialog в AutoCAD нельзя. Это аксиома.
Если вы мне приведете документальное описание этой аксиомы, я соглашусь и буду это использовать. Но пока это звучит как нонсенс. По моему мнению отдельный метод для ShowDialog используется только для установки Owner handle в свойства формы и больше ни для чего.

Без него ты не имеешь права обращаться к редактору (Editor). Ну, т.е. если хочешь видеть эти артефакты и шансы развалить AutoCAD - то пожалуйста используй.
Я могу обращаться к нему без форм, почему вдруг я не могу обращаться к нему с наличием форм? Начала работать моя команда (вызовом из интерфейса), мой код и в это время ничто другое не должно влиять неизвестным образом на мои действия. А если влияет, то от этого ничто не спасет, может быть что угодно. Можно, пожалуйста, привести примеры артефактов, связанных с некорректным использованием диалогов?

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #9 : 30-01-2015, 20:31:00 »
Если это второй вопрос, то я его не понял. Или объясни так, как я сказал (код, видео). Ну или жди - может кто-нибудь сможет тебя понять.
постараюсь объяснить скриншотами.




1. Это стандартный выбор точки с использованием editor drag (jig) или getpoint
Что видно:
-текст сообщения
-поля ввода координат. Важно: они справа от текста сообщения



2. Сейчас я запустил команду подобие, указал смещение и выбрал объект
Что видно:
- текст сообщения
- поля ввода координат нет
- зеленым овалом я отметил поле ввода нового смещения. Важно отметить, что оно не привязано к курсору и тексту сообщения.



3. Что я хочу получить: все тоже самое, что в первом случае, но без ввода координат, вообще без этих полей.

Почему это нужно: в режимах prompt или drag (jig) в editor невозможно случайно вызвать другую команду, пока выполняется твоя. Я не хочу чтобы нечто другое изменило мои объекты/примитивы во время действия моей команды. Пускай пользователь нажимает Esc или в меню вызывает другую команду.
Допустим я нарисовал линию и спрашиваю у пользователя в какой полуплоскости мне надо поместить объекты и при этом я их отрисовываю с помощью Transient Graphic в соответствии с положением курсора. Ввод координат точки в этом случае - не нужен.
Или я из модальной формы хочу сделать временный просмотр чертежа, подвигать туда-сюда, зум. Мне этот ввод координат точки не нужен. Он только сбивает с толку в контексте выполняемой операции.

Т.е. я хочу сохранить преимущество read-only просмотра чертежа в режиме prompt/drag и отказаться от стандартных способов ввода данных в этих режимах.





 

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #10 : 30-01-2015, 21:16:42 »
По моему мнению отдельный метод для ShowDialog используется только для установки Owner handle в свойства формы и больше ни для чего.
А может исходники сначала глянешь:
Код - C# [Выбрать]
  1. // Autodesk.AutoCAD.ApplicationServices.Application
  2. public unsafe static DialogResult ShowModalDialog(IntPtr owner, Form formToShow, [MarshalAs(UnmanagedType.U1)] bool persistSizeAndPosition)
  3. {
  4.         FloatingWindowsHookWinForm floatingWindowsHookWinForm = null;
  5.         bool flag = false;
  6.         DialogResult result;
  7.         try
  8.         {
  9.                 AcApDocManager* expr_0A = <Module>.acDocManagerPtr();
  10.                 if (calli(System.Byte modopt(System.Runtime.CompilerServices.CompilerMarshalOverride) modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr), expr_0A, *(*expr_0A + 232L)))
  11.                 {
  12.                         AcApDocManager* expr_20 = <Module>.acDocManagerPtr();
  13.                         flag = (calli(Acad/ErrorStatus modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr), expr_20, *(*expr_20 + 216L)) == 0 || flag);
  14.                 }
  15.                 if (persistSizeAndPosition)
  16.                 {
  17.                         formToShow.Load += new EventHandler(Application.OnFormLoad_Persistence);
  18.                         formToShow.Closed += new EventHandler(Application.OnFormClosed_Persistence);
  19.                 }
  20.                 try
  21.                 {
  22.                         FloatingWindowsHookWinForm floatingWindowsHookWinForm2 = new FloatingWindowsHookWinForm(formToShow);
  23.                         DialogResult dialogResult;
  24.                         try
  25.                         {
  26.                                 floatingWindowsHookWinForm = floatingWindowsHookWinForm2;
  27.                                 HICON__* value = <Module>.AcUiGetAppIcon(0, false);
  28.                                 IntPtr handle = new IntPtr((void*)value);
  29.                                 formToShow.Icon = Icon.FromHandle(handle);
  30.                                 HWND__* ptr = (HWND__*)formToShow.Handle.ToPointer();
  31.                                 if (ptr != null)
  32.                                 {
  33.                                         HWND__* ptr2 = (HWND__*)owner.ToPointer();
  34.                                         if (<Module>.IsWindow(ptr2) != null && ptr != ptr2)
  35.                                         {
  36.                                                 <Module>.SetWindowLongPtrW(ptr, -8, ptr2);
  37.                                         }
  38.                                 }
  39.                                 dialogResult = formToShow.ShowDialog();
  40.                                 if (dialogResult == DialogResult.Cancel)
  41.                                 {
  42.                                         <Module>.SetDiastat(0);
  43.                                         <Module>.acedCommandCancelled();
  44.                                 }
  45.                                 else
  46.                                 {
  47.                                         <Module>.SetDiastat(1);
  48.                                 }
  49.                         }
  50.                         catch
  51.                         {
  52.                                 ((IDisposable)floatingWindowsHookWinForm).Dispose();
  53.                                 throw;
  54.                         }
  55.                         ((IDisposable)floatingWindowsHookWinForm).Dispose();
  56.                         result = dialogResult;
  57.                 }
  58.                 finally
  59.                 {
  60.                         if (persistSizeAndPosition)
  61.                         {
  62.                                 formToShow.Load -= new EventHandler(Application.OnFormLoad_Persistence);
  63.                                 formToShow.Closed -= new EventHandler(Application.OnFormClosed_Persistence);
  64.                         }
  65.                 }
  66.         }
  67.         finally
  68.         {
  69.                 if (flag)
  70.                 {
  71.                         AcApDocManager* expr_124 = <Module>.acDocManagerPtr();
  72.                         object arg_133_0 = calli(Acad/ErrorStatus modopt(System.Runtime.CompilerServices.CallConvCdecl)(System.IntPtr), expr_124, *(*expr_124 + 224L));
  73.                 }
  74.         }
  75.         return result;
  76. }
  77.  
Если вы мне приведете документальное описание этой аксиомы, я соглашусь и буду это использовать. Но пока это звучит как нонсенс.
Вообще-то здесь на форуме (да и на других тоже) мне обычно верят на слово. Но если тебе нужны ссылки - пожалуйста:
1) http://adn-cis.org/otobrazhenie-modalnyix-i-nemodalnyix-form-v-autocad-.net.html (оригинал здесь: http://adndevblog.typepad.com/autocad/2012/06/displaying-modal-and-modeless-forms-in-autocad-net.html ) Автор этого поста Стивен Престон возглавляет ADN DevHelp - службу технической поддержки разработчиков продуктов Autodesk.
2) http://through-the-interface.typepad.com/through_the_interface/2008/08/the-right-way-t.html - Блог Киана Уомсли, который долгие годы был членом ADN DevHelp
3) Куча информации по этому поводу здесь: http://forums.autodesk.com/t5/forums/searchpage/tab/message?location=forum-board%3A152&q=showdialog+or+showmodaldialog&filter=labels%2Clocation

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

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #11 : 30-01-2015, 21:35:13 »
3. Что я хочу получить: все тоже самое, что в первом случае, но без ввода координат, вообще без этих полей.
Вместо AcquirePoint попробуй использовать AcquireDistance. Кроме того можно попробовать на время JIG поиграться системными переменными DYNXXXX (DYNMODE и т.д.)
P.S.: Проще всего временно установить DYNMODE в 0.
« Последнее редактирование: 31-01-2015, 01:35:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #12 : 30-01-2015, 22:24:02 »
Вообще-то здесь на форуме (да и на других тоже) мне обычно верят на слово
Извините, но по ряду причин приходиться верить только в эффективность и решение задач. На людей стараюсь не обижаться и не обижать) Работать просто надо.

Блог Киана Уомсли частенько читал, много полезного оттуда использовал. Помимо этого Swamp, этот сайт, да еще куча всего. Но все не охватить.
Вопрос вот в чем: например статья 2008 года она актуальна? Алгоритм работы с ShowDialog практически нигде не описан, а значит и изменения не отследить. Вот такое вот поведение <Module>.acedCommandCancelled(); меня вообще не радует. А что там в новых версиях происходит? Логика должна быть прозрачной.


Вместо AcquirePoint попробуй использовать AcquireDistance. Коме того можно попробовать на время JIG поиграться системными переменными DYNXXXX (DYNMODE и т.д.)
P.S.: Проще всего временно установить DYNMODE в 0.
В этом случае не виден текст сообщения и непонятно можно ли использовать Keywords или нет. К тому же ввод в командной строке продолжается. В общем поведение становится как раз неуправляемым.
В тоже самое время очевидно, что как разработчик я бы сам мог задать поведение (отрисовка textbox, кнопок в transient graphics и др.) и управлять им. Даже тот же Keywords можно реализовать собственными контролами. Да нужно это далеко не всем, но сложности в организации доступности такого подхода не вижу. Очевидно, в текущих версиях это вряд ли добавят. Но допустим я хочу продвинуть эту идею в новом релизе. Что мне нужно для этого сделать?

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

  • Administrator
  • *****
  • Сообщений: 13843
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Свободные Jigs
« Ответ #13 : 30-01-2015, 23:05:29 »
Вопрос вот в чем: например статья 2008 года она актуальна?
Да. Абсолютно актуальна. Кстати, статья Стивена Престона от 2012 года, т.е. подразумевает как минимум AutoCAD 2013.
 
Вот такое вот поведение <Module>.acedCommandCancelled(); меня вообще не радует.
Чем?
А что там в новых версиях происходит? Логика должна быть прозрачной.
Этот код я привел из версии 2014. Воспользуйся ILSPY или аналогичными утилитами и посмотри сам.
В этом случае не виден текст сообщения и непонятно можно ли использовать Keywords или нет.
Keywords можно использовать всегда. От DYNMODE они не зависят ибо были еще за долго до того, как DYNMODE появилось. А по поводу текста - видимо я тебя не понял и решил, что ты и его хочешь скрыть.
Очевидно, в текущих версиях это вряд ли добавят. Но допустим я хочу продвинуть эту идею в новом релизе. Что мне нужно для этого сделать?
1) Внятно сформулировать своё пожелание и желательно на английском и объяснить, что никакими другими способами этого достичь нельзя или это будет очень сложно и трудоемко.
2) Доказать, что это необходимо не только тебе, но и достаточно большому количеству программистов или пользователей твоего приложения.
3) Оценить какая потенциальная прибыть от этого будет у Autodesk - мы живём в меркантильном мире.
P.S.: В новом релизе, даже если бы мы отправили этот Wish сегодня, этого точно не будет. До него осталось не так долго.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Re: Свободные Jigs
« Ответ #14 : 30-01-2015, 23:42:57 »
Чем?
Тем, что я могу быть подписан на отмену команд. И при этом я сам освобождаю используемые мной ресурсы, подписки на события и т.д. И вот мне прилетает отмена, которая вообще непонятно почему возникла. Да, обойти это можно, но это странное поведение.

Этот код я привел из версии 2014. Воспользуйся ILSPY или аналогичными утилитами и посмотри сам.
я не думаю, что реверс-инжиниринг актуален для большинства разработчиков


Keywords можно использовать всегда. От DYNMODE они не зависят ибо были еще за долго до того, как DYNMODE появилось. А по поводу текста - видимо я тебя не понял и решил, что ты и его хочешь скрыть.
Я хотел сказать, что пользователь не поймет, что в данной операции можно использовать другой вариант. Многие профи конечно любят использовать командную строку и там увидят нужное, но это не всегда удобное поведение. Подсказка  в 90% случаях нужна.

В новом релизе, даже если бы мы отправили этот Wish сегодня, этого точно не будет. До него осталось не так долго.
ну есть сервис паки и т.д. это не значит, что не нужно двигаться вперед. Тем более в данном случае можно сказать, что уже все реализовано, но просто не предоставлено. Ок, wish будет составлено. Кому его отсылать? Я могу и напрямую разработчикам написать, проблем с переводом техн. английского у меня нет.