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

ADN Club => AutoCAD .NET API => Тема начата: TimeHunter от 30-01-2015, 15:19:44

Название: Свободные Jigs
Отправлено: TimeHunter от 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
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 30-01-2015, 15:36:34
Приветствую на форуме!
Увы, но я ничего не понял. Хотя бы видео запиши ( https://screencast.autodesk.com ), чтобы было понятно о чем ты пишешь.
Что касается восстановления командной строки, то Editor.PostCommandPrompt должен помочь.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 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
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 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 главного окна устанавливаю, никаких ошибок в связи с этим еще не ловил.

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

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

Сейчас это не самая критичная штука, все же с этим можно жить, хоть и неудобно. Второй вопрос более актуален.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 30-01-2015, 17:22:57
Это работает пока одна форма, а если я в форме по кнопке создаю еще одну форму? При StartUserInteraction на второй форме выдает Exception "NotActiveWindow".
Из вложенной формы к редактору AutoCAD ты не достучишься. Еще раз. Использовать Form.ShowDialog в AutoCAD нельзя. Это аксиома.
Но есть еще одна проблема: пусть я начал использовать StartUserInteraction, но понял, что не хочу использовать текущую команду и вызвал другую. В этот момент я не хочу, чтобы у меня появилось скрытое окно, а высвободить ресурсы, отписаться от событий и перейти к функционалу новой команды. В случае с StartUserInteraction окно появится, а без него - я могу этим управлять.
Без него ты не имеешь права обращаться к редактору (Editor). Ну, т.е. если хочешь видеть эти артефакты и шансы развалить AutoCAD - то пожалуйста используй.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 30-01-2015, 17:25:17
2) Можно ли каким-либо способом задать диалоговый режим с чертежем, чтобы: а) работал PointMonitor б) работала Transient Graphic в) прерывание как jig (через Esc или вызов команды в меню/интерфейсе) г) без лишнего ввода информации как в jig
Если это второй вопрос, то я его не понял. Или объясни так, как я сказал (код, видео). Ну или жди - может кто-нибудь сможет тебя понять.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 30-01-2015, 20:06:54
Из вложенной формы к редактору AutoCAD ты не достучишься. Еще раз. Использовать Form.ShowDialog в AutoCAD нельзя. Это аксиома.
Если вы мне приведете документальное описание этой аксиомы, я соглашусь и буду это использовать. Но пока это звучит как нонсенс. По моему мнению отдельный метод для ShowDialog используется только для установки Owner handle в свойства формы и больше ни для чего.

Без него ты не имеешь права обращаться к редактору (Editor). Ну, т.е. если хочешь видеть эти артефакты и шансы развалить AutoCAD - то пожалуйста используй.
Я могу обращаться к нему без форм, почему вдруг я не могу обращаться к нему с наличием форм? Начала работать моя команда (вызовом из интерфейса), мой код и в это время ничто другое не должно влиять неизвестным образом на мои действия. А если влияет, то от этого ничто не спасет, может быть что угодно. Можно, пожалуйста, привести примеры артефактов, связанных с некорректным использованием диалогов?
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 30-01-2015, 20:31:00
Если это второй вопрос, то я его не понял. Или объясни так, как я сказал (код, видео). Ну или жди - может кто-нибудь сможет тебя понять.
постараюсь объяснить скриншотами.


(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs14.postimg.org%2Fjgammgz8d%2Fimage.jpg&hash=8cf56840b9a5d25b8f993c4dc03e6db4) (http://postimg.org/image/jgammgz8d/)

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

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs28.postimg.org%2Fy4t3sv6l5%2Fimage.jpg&hash=28291bc76ebfc77c169662a8a6e6e7d1) (http://postimg.org/image/y4t3sv6l5/)

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

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs16.postimg.org%2F5ath307z5%2Fimage.jpg&hash=609ec5d8726da160dae97f71f8a514e3) (http://postimg.org/image/5ath307z5/)

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

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

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





 
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 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

Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 30-01-2015, 21:35:13
3. Что я хочу получить: все тоже самое, что в первом случае, но без ввода координат, вообще без этих полей.
Вместо AcquirePoint попробуй использовать AcquireDistance. Кроме того можно попробовать на время JIG поиграться системными переменными DYNXXXX (DYNMODE и т.д.)
P.S.: Проще всего временно установить DYNMODE в 0.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 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 можно реализовать собственными контролами. Да нужно это далеко не всем, но сложности в организации доступности такого подхода не вижу. Очевидно, в текущих версиях это вряд ли добавят. Но допустим я хочу продвинуть эту идею в новом релизе. Что мне нужно для этого сделать?
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 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 сегодня, этого точно не будет. До него осталось не так долго.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 30-01-2015, 23:42:57
Чем?
Тем, что я могу быть подписан на отмену команд. И при этом я сам освобождаю используемые мной ресурсы, подписки на события и т.д. И вот мне прилетает отмена, которая вообще непонятно почему возникла. Да, обойти это можно, но это странное поведение.

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


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

В новом релизе, даже если бы мы отправили этот Wish сегодня, этого точно не будет. До него осталось не так долго.
ну есть сервис паки и т.д. это не значит, что не нужно двигаться вперед. Тем более в данном случае можно сказать, что уже все реализовано, но просто не предоставлено. Ок, wish будет составлено. Кому его отсылать? Я могу и напрямую разработчикам написать, проблем с переводом техн. английского у меня нет.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 31-01-2015, 00:04:38
Тем, что я могу быть подписан на отмену команд. И при этом я сам освобождаю используемые мной ресурсы, подписки на события и т.д. И вот мне прилетает отмена, которая вообще непонятно почему возникла. Да, обойти это можно, но это странное поведение.
Почему же непонятно почему прилетит? Нажал "Отмена" в диалогов окне - вот тебе и результат. Кстати это общая логика команд AutoCAD. Если ты сделаешь свою логику поведения, которая будет идти вразрез с общей логикой, то не думаю что пользователи обрадуются.
Вообще-то если мне не изменяет память в действительности ничего не "прилетает", т.е. вызов acedCommandCancelled не приводит к генерации события CommandCanceled.
я не думаю, что реверс-инженеринг актуален для большинства разработчиков
Безусловно. Я это написал только для того, чтобы ты сам мог проанализировать код в AutoCAD 2015, если он тебя интересует.
ну есть сервис паки и т.д.
В SP Autodesk исправляет ошибки, но не меняет логику поведения. Так что на это расчитывать не советую. Поверь моему 25-летнему опыту.
Кому его отсылать? Я могу и напрямую разработчикам написать, проблем с переводом техн. английского у меня нет.
Ну если у тебя есть прямая связь с разработчиками - то шли им. Если нет, то пиши здесь. Я передам как пожелание. Но не забудь про все три пункта - без них Autodesk не будет рассматривать твоё пожелание.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 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]
Название: Re: Свободные Jigs
Отправлено: Дима_ от 31-01-2015, 01:36:21
Здравствуйте. Можно и я влезу в Ваш диалог? Я, если честно, вообще не вижу ни одного реального случая когда в автокаде нужны именно диалоговые окна (то есть когда работают только оно одно) и могу привести бесконечное количество вариантов - когда несколько окон - на порядок удобней (с установленным флагом "всегда сверху" - TopMost). ИХМО диалоговое окно - это архаизм из времен DCL, "отловить" или заблокировать документ в "нужные" моменты оно-же как и спрятать и вернуть окно - никакой проблемы нет. Уж с чем - но только не с проблемами с окошками я не сталкивался. 
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 02-02-2015, 10:42:23
Нажал "Отмена" в диалогов окне - вот тебе и результат. Кстати это общая логика команд AutoCAD
Отмена в диалоговом окно может быть связана с отменой команды в частных случаях, но не обязана быть отменой для всех команд. Для любой нормальной архитектуры программы это выглядит как костыль, с которым потом еще нужно разбираться.  Я уверен, что это не критичный момент, раз все эти команды работают. Пускай внутри используют что хотят. Но для внешних разработок такие моменты должны быть под контролем внешнего разработчика.
Простой пример: та же вложенность форм в одной команде. Если использовать StartUserInteraction, то нужно вложенную схему преобразовать в линейную. А в линейной схеме диалоговая отмена в одной из форм логически может быть не связана с завершением команды. Впрочем, раз событие CommandCanceled не генерируется, то можно считать эту часть кода несущественной.
 
диалоговое окно - это архаизм из времен DCL
это просто самое эффективное средство из тех, что есть.
Обращу внимание на задачу. Выполняется интерактивная команда, в ходе которой не должно быть вызовов других команд из editor (самая простая возможность - взять конец отрезка и потянуть) или из командной строки. Это действительно важно.
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастика) Но пока я не могу это сделать.
В любом случае это все равно будет некий ограниченный диалог, только другого вида. Иначе вы не сможете гарантировать выполнение задачи или хотя бы ее поведение.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 02-02-2015, 10:51:22
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастика
есть идея по натягиванию 1% недиалогового wpf на autocad  с гибкой блокировкой в MessageFilter. Но пока не знаю, сколько времени это может занять и что за костыль в итоге выйдет, но для фана можно попробовать.
Минусы: примерно на 1% станет тусклее изображение.
Плюсы: можно легко использовать какие угодно контролы без transient graphics
Название: Re: Свободные Jigs
Отправлено: Дима_ от 02-02-2015, 22:34:32
Обращу внимание на задачу. Выполняется интерактивная команда, в ходе которой не должно быть вызовов других команд из editor (самая простая возможность - взять конец отрезка и потянуть) или из командной строки. Это действительно важно.
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастика) Но пока я не могу это сделать.
4 раза прочел - так и не понял... Еще раз - чего надо сделать?
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 02-02-2015, 22:58:59
чего надо сделать?
Чтобы при любых действиях в чертеже не вызывались стандартные команды. Это нужно для контроля состояния объекта. Например, при выполнении команды  переноса отрезка нельзя изменить его длину. После - пожалуйста, но не во время выполнения переноса.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 02-02-2015, 23:06:55
Чтобы при любых действиях в чертеже не вызывались стандартные команды. Это нужно для контроля состояния объекта. Например, при выполнении команды  переноса отрезка нельзя изменить его длину. После - пожалуйста, но не во время выполнения переноса.
Состояние объекта может быть изменено не только стандартными командами, но и например из Панели Свойств.
P.S.: Видимо и у меня и у Дима_ плохо с воображением и без видео нам не понять твоих задумок.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 02-02-2015, 23:13:42
Состояние объекта может быть изменено не только стандартными командами, но и например из Панели Свойств.
Это отдельная задача, она легко отслеживается. Логика простая - запуск новой команды означает прекращение текущей. Неконтроллируемое изменение объекта(с точки зрения запущенной команды) также означает прекращение команды.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 02-02-2015, 23:32:57
А "стандартными" средствами проконтролировать объект (или запретить его изменение).
Блокировка слоя не подходит из-за визуального ухудшения отображения. А других вариантов я не знаю. Без блокировки слоя изменение объекта можно только отследить, но не запретить.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 03-02-2015, 00:04:34
Без блокировки слоя изменение объекта можно только отследить, но не запретить.
Думаешь? Ну есть как минимум один способ запретить: ObjectOverrule
Небольшой пример: http://drive-cad-with-code.blogspot.com/2012/03/using-objectoverrule-to-prevent-entity.html
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 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 сейчас это невозможно или способ мне неизвестен.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 03-02-2015, 09:31:34
Допустим, у меня тысячи объектов на чертеже. Как я вообще пойму, что этот объект стал невидимым? Это разве не изменение? По-моему защита не сработала.
Код смотрел? Там вообще-то речь идет о блоке (точнее о вставке блока) и особенность именно из-за этого, а тебе нужно обработать все типы примитивов.
Правильный выход - не допустить порождения команды действиями в чертеже.
Правильный подход - использовать AutoCAD UI, а не изобретать свой.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 03-02-2015, 09:40:22
Есть еще один метод запретить команды - в DocumentCollection.DocumentLockModeChanged вызвать Veto.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 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.
Проблема в том, что источник (откуда началась команда) неизвестен. Если из меню/по кнопке - Ок. Если действиями в чертеже - Нет.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 03-02-2015, 14:27:16
В самом Autodesk его используют. Они используют именно то, что я показывал на скриншотах.
Подозреваю что всё что тебе хочется достигается комбинацией Autodesk.AutoCAD.EditorInput.CursorType, Autodesk.AutoCAD.EditorInput.UserInputControls и значений системных переменных DYNXXXX, выбором JigPrompts.AcquireDistance или JigPrompts.AcquirePoint. Ну и т.д.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 03-02-2015, 18:07:48
Подозреваю что всё что тебе хочется достигается комбинацией Autodesk.AutoCAD.EditorInput.CursorType, Autodesk.AutoCAD.EditorInput.UserInputControls и значений системных переменных DYNXXXX, выбором JigPrompts.AcquireDistance или JigPrompts.AcquirePoint. Ну и т.д.

Autodesk.AutoCAD.EditorInput.CursorType и Autodesk.AutoCAD.EditorInput.UserInputControls бесполезны для задачи.
JigPrompts.AcquireDistance или JigPrompts.AcquirePoint с использованием DYNMODE = 0 некорректно ведут себя при вводе с командной строки.

Но в итоге решение найдено. Все те же JigPrompts.AcquirePoint с использованием DYNMODE = 0. Для отключения доступа к командной строке клавиатурный ввод в MessageFilter перенаправляется в собственный обработчик и таким образом ввод в командную строку отключен. Также это означает отказ от Keywords.
Далее, дополнительно взята идея из использования прозрачного wpf поверх  всего AutoCAD. В данном случае я использую небольшое настраиваемое прозрачное (opacity = 1%) wpf окно и любые контролы, какие хочу. Панель и границы окна скрыты, по сути видны только нужные контролы. Т.е. легко можно реализовать все, что угодно. И прикрепить обработчик по движению к курсору или отдельно.
Не без костылей и не та самая реализация, что в примере в команде Смещение (_offset), но вполне должно работать и имеет кучу плюсов.
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 03-02-2015, 18:37:57
Но в итоге решение найдено.
Отлично. Интересно бы взглянуть на видео как это работает.
Название: Re: Свободные Jigs
Отправлено: TimeHunter от 04-02-2015, 09:47:02
Отлично. Интересно бы взглянуть на видео как это работает.
ближе к  выходным или на выходных выложу, ряд вопросов требует проработки
Название: Re: Свободные Jigs
Отправлено: Александр Ривилис от 04-02-2015, 13:50:16
Отлично. Я не зря прошу видео. Так как я понимаю, что понимаю твои потребности где-то на 20% и надеюсь, что по видео смогу понять их хотябы на 80%. И тогда возможно смогу подсказать другие алгоритмы.