По кнопке вызываю jig, что-то делаю и возвращаюсь на форму.Про Editor.StartUserInteraction надеюсь не забываешь? Пример использования здесь: http://adndevblog.typepad.com/autocad/2012/05/taking-mouse-inputs-from-a-modal-dialog-box.html
Что касается восстановления командной строки, то 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 главного окна устанавливаю, никаких ошибок в связи с этим еще не ловил.
я в ShowDialog Handle главного окна устанавливаю, никаких ошибок в связи с этим еще не ловил.Не понял. Ты показываешь диалог в AutoCAD не при помощи Application.ShowModalDialog, а при помощи Form.ShowDialog? Ну тогда большинство проблем у тебя именно от этого...
Не понял. Ты показываешь диалог в AutoCAD не при помощи Application.ShowModalDialog, а при помощи Form.ShowDialog? Ну тогда большинство проблем у тебя именно от этого...Это работает пока одна форма, а если я в форме по кнопке создаю еще одну форму? При StartUserInteraction на второй форме выдает Exception "NotActiveWindow". Допустим, это можно разрулить засчет архитектуры кода, чтобы не было вложенности вызова форм.
Это работает пока одна форма, а если я в форме по кнопке создаю еще одну форму? При StartUserInteraction на второй форме выдает Exception "NotActiveWindow".Из вложенной формы к редактору AutoCAD ты не достучишься. Еще раз. Использовать Form.ShowDialog в AutoCAD нельзя. Это аксиома.
Но есть еще одна проблема: пусть я начал использовать StartUserInteraction, но понял, что не хочу использовать текущую команду и вызвал другую. В этот момент я не хочу, чтобы у меня появилось скрытое окно, а высвободить ресурсы, отписаться от событий и перейти к функционалу новой команды. В случае с StartUserInteraction окно появится, а без него - я могу этим управлять.Без него ты не имеешь права обращаться к редактору (Editor). Ну, т.е. если хочешь видеть эти артефакты и шансы развалить AutoCAD - то пожалуйста используй.
2) Можно ли каким-либо способом задать диалоговый режим с чертежем, чтобы: а) работал PointMonitor б) работала Transient Graphic в) прерывание как jig (через Esc или вызов команды в меню/интерфейсе) г) без лишнего ввода информации как в jigЕсли это второй вопрос, то я его не понял. Или объясни так, как я сказал (код, видео). Ну или жди - может кто-нибудь сможет тебя понять.
Из вложенной формы к редактору AutoCAD ты не достучишься. Еще раз. Использовать Form.ShowDialog в AutoCAD нельзя. Это аксиома.Если вы мне приведете документальное описание этой аксиомы, я соглашусь и буду это использовать. Но пока это звучит как нонсенс. По моему мнению отдельный метод для ShowDialog используется только для установки Owner handle в свойства формы и больше ни для чего.
Без него ты не имеешь права обращаться к редактору (Editor). Ну, т.е. если хочешь видеть эти артефакты и шансы развалить AutoCAD - то пожалуйста используй.Я могу обращаться к нему без форм, почему вдруг я не могу обращаться к нему с наличием форм? Начала работать моя команда (вызовом из интерфейса), мой код и в это время ничто другое не должно влиять неизвестным образом на мои действия. А если влияет, то от этого ничто не спасет, может быть что угодно. Можно, пожалуйста, привести примеры артефактов, связанных с некорректным использованием диалогов?
Если это второй вопрос, то я его не понял. Или объясни так, как я сказал (код, видео). Ну или жди - может кто-нибудь сможет тебя понять.постараюсь объяснить скриншотами.
По моему мнению отдельный метод для ShowDialog используется только для установки Owner handle в свойства формы и больше ни для чего.А может исходники сначала глянешь:
Если вы мне приведете документальное описание этой аксиомы, я соглашусь и буду это использовать. Но пока это звучит как нонсенс.Вообще-то здесь на форуме (да и на других тоже) мне обычно верят на слово. Но если тебе нужны ссылки - пожалуйста:
3. Что я хочу получить: все тоже самое, что в первом случае, но без ввода координат, вообще без этих полей.Вместо AcquirePoint попробуй использовать AcquireDistance. Кроме того можно попробовать на время JIG поиграться системными переменными DYNXXXX (DYNMODE и т.д.)
Вообще-то здесь на форуме (да и на других тоже) мне обычно верят на словоИзвините, но по ряду причин приходиться верить только в эффективность и решение задач. На людей стараюсь не обижаться и не обижать) Работать просто надо.
Вместо AcquirePoint попробуй использовать AcquireDistance. Коме того можно попробовать на время JIG поиграться системными переменными DYNXXXX (DYNMODE и т.д.)В этом случае не виден текст сообщения и непонятно можно ли использовать Keywords или нет. К тому же ввод в командной строке продолжается. В общем поведение становится как раз неуправляемым.
P.S.: Проще всего временно установить DYNMODE в 0.
Вопрос вот в чем: например статья 2008 года она актуальна?Да. Абсолютно актуальна. Кстати, статья Стивена Престона от 2012 года, т.е. подразумевает как минимум AutoCAD 2013.
Вот такое вот поведение <Module>.acedCommandCancelled(); меня вообще не радует.Чем?
А что там в новых версиях происходит? Логика должна быть прозрачной.Этот код я привел из версии 2014. Воспользуйся ILSPY или аналогичными утилитами и посмотри сам.
В этом случае не виден текст сообщения и непонятно можно ли использовать Keywords или нет.Keywords можно использовать всегда. От DYNMODE они не зависят ибо были еще за долго до того, как DYNMODE появилось. А по поводу текста - видимо я тебя не понял и решил, что ты и его хочешь скрыть.
Очевидно, в текущих версиях это вряд ли добавят. Но допустим я хочу продвинуть эту идею в новом релизе. Что мне нужно для этого сделать?1) Внятно сформулировать своё пожелание и желательно на английском и объяснить, что никакими другими способами этого достичь нельзя или это будет очень сложно и трудоемко.
Чем?Тем, что я могу быть подписан на отмену команд. И при этом я сам освобождаю используемые мной ресурсы, подписки на события и т.д. И вот мне прилетает отмена, которая вообще непонятно почему возникла. Да, обойти это можно, но это странное поведение.
Этот код я привел из версии 2014. Воспользуйся ILSPY или аналогичными утилитами и посмотри сам.я не думаю, что реверс-инжиниринг актуален для большинства разработчиков
Keywords можно использовать всегда. От DYNMODE они не зависят ибо были еще за долго до того, как DYNMODE появилось. А по поводу текста - видимо я тебя не понял и решил, что ты и его хочешь скрыть.Я хотел сказать, что пользователь не поймет, что в данной операции можно использовать другой вариант. Многие профи конечно любят использовать командную строку и там увидят нужное, но это не всегда удобное поведение. Подсказка в 90% случаях нужна.
В новом релизе, даже если бы мы отправили этот Wish сегодня, этого точно не будет. До него осталось не так долго.ну есть сервис паки и т.д. это не значит, что не нужно двигаться вперед. Тем более в данном случае можно сказать, что уже все реализовано, но просто не предоставлено. Ок, wish будет составлено. Кому его отсылать? Я могу и напрямую разработчикам написать, проблем с переводом техн. английского у меня нет.
Тем, что я могу быть подписан на отмену команд. И при этом я сам освобождаю используемые мной ресурсы, подписки на события и т.д. И вот мне прилетает отмена, которая вообще непонятно почему возникла. Да, обойти это можно, но это странное поведение.Почему же непонятно почему прилетит? Нажал "Отмена" в диалогов окне - вот тебе и результат. Кстати это общая логика команд AutoCAD. Если ты сделаешь свою логику поведения, которая будет идти вразрез с общей логикой, то не думаю что пользователи обрадуются.
я не думаю, что реверс-инженеринг актуален для большинства разработчиковБезусловно. Я это написал только для того, чтобы ты сам мог проанализировать код в AutoCAD 2015, если он тебя интересует.
ну есть сервис паки и т.д.В SP Autodesk исправляет ошибки, но не меняет логику поведения. Так что на это расчитывать не советую. Поверь моему 25-летнему опыту.
Кому его отсылать? Я могу и напрямую разработчикам написать, проблем с переводом техн. английского у меня нет.Ну если у тебя есть прямая связь с разработчиками - то шли им. Если нет, то пиши здесь. Я передам как пожелание. Но не забудь про все три пункта - без них Autodesk не будет рассматривать твоё пожелание.
Вообще-то если мне не изменяет память в действительности ничего не "прилетает", т.е. вызов acedCommandCancelled не приводит к генерации события CommandCanceled.Память не изменила. Сляпал быстренько тест на ObjectARX и включил в ARXDBG проверку на реакторы:
Команда: _MYCOMMAND1
[ED REACTOR] : [Command Will Start: MYCOMMAND1]
[ED REACTOR] : [Command Ended: MYCOMMAND1]
Если команда прерывается, то это выглядит так:Команда: _MYCOMMAND1
[ED REACTOR] : [Command Will Start: MYCOMMAND1] *Прервано*
[ED REACTOR] : [Command Cancelled: MYCOMMAND1]
Нажал "Отмена" в диалогов окне - вот тебе и результат. Кстати это общая логика команд AutoCADОтмена в диалоговом окно может быть связана с отменой команды в частных случаях, но не обязана быть отменой для всех команд. Для любой нормальной архитектуры программы это выглядит как костыль, с которым потом еще нужно разбираться. Я уверен, что это не критичный момент, раз все эти команды работают. Пускай внутри используют что хотят. Но для внешних разработок такие моменты должны быть под контролем внешнего разработчика.
диалоговое окно - это архаизм из времен DCLэто просто самое эффективное средство из тех, что есть.
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастикаесть идея по натягиванию 1% недиалогового wpf на autocad с гибкой блокировкой в MessageFilter. Но пока не знаю, сколько времени это может занять и что за костыль в итоге выйдет, но для фана можно попробовать.
Обращу внимание на задачу. Выполняется интерактивная команда, в ходе которой не должно быть вызовов других команд из editor (самая простая возможность - взять конец отрезка и потянуть) или из командной строки. Это действительно важно.4 раза прочел - так и не понял... Еще раз - чего надо сделать?
Если можно будет сделать это без связки "диалоговое окно + jig", то это будет фантастика) Но пока я не могу это сделать.
чего надо сделать?Чтобы при любых действиях в чертеже не вызывались стандартные команды. Это нужно для контроля состояния объекта. Например, при выполнении команды переноса отрезка нельзя изменить его длину. После - пожалуйста, но не во время выполнения переноса.
Чтобы при любых действиях в чертеже не вызывались стандартные команды. Это нужно для контроля состояния объекта. Например, при выполнении команды переноса отрезка нельзя изменить его длину. После - пожалуйста, но не во время выполнения переноса.Состояние объекта может быть изменено не только стандартными командами, но и например из Панели Свойств.
Состояние объекта может быть изменено не только стандартными командами, но и например из Панели Свойств.Это отдельная задача, она легко отслеживается. Логика простая - запуск новой команды означает прекращение текущей. Неконтроллируемое изменение объекта(с точки зрения запущенной команды) также означает прекращение команды.
А "стандартными" средствами проконтролировать объект (или запретить его изменение).Блокировка слоя не подходит из-за визуального ухудшения отображения. А других вариантов я не знаю. Без блокировки слоя изменение объекта можно только отследить, но не запретить.
Без блокировки слоя изменение объекта можно только отследить, но не запретить.Думаешь? Ну есть как минимум один способ запретить: ObjectOverrule
Небольшой пример: http://drive-cad-with-code.blogspot.com/2012/03/using-objectoverrule-to-prevent-entity.htmlдумаю любой, кто прочитает эту статью, найдет для себя хоть одну причину не использовать этот способ.
Допустим, у меня тысячи объектов на чертеже. Как я вообще пойму, что этот объект стал невидимым? Это разве не изменение? По-моему защита не сработала.Код смотрел? Там вообще-то речь идет о блоке (точнее о вставке блока) и особенность именно из-за этого, а тебе нужно обработать все типы примитивов.
Правильный выход - не допустить порождения команды действиями в чертеже.Правильный подход - использовать AutoCAD UI, а не изобретать свой.
Код смотрел? Там вообще-то речь идет о блоке (точнее о вставке блока) и особенность именно из-за этого, а тебе нужно обработать все типы примитивов.Ок, блок состоит из примитивов, атрибутов, чего-то возможно еще, тут мои знания ограничены. И по какой-то причине Move решил поработать с примитивами блока, а не с целым блоком.
Правильный подход - использовать AutoCAD UI, а не изобретать свой.ну так я и предлагаю его использовать, разве нет? В самом Autodesk его используют. Они используют именно то, что я показывал на скриншотах. Тот же самый диалоговый/модальный подход с prompt/jig. Только без ограничений в виде ненужных типов ввода данных. Все связано с названием темы, а остальное - побочное. Не следует воспринимать всерьез использование прозрачного wpf окна поверх окна AutoCAD с прочей магией. Там же написано - "для фана".
Есть еще один метод запретить команды - в DocumentCollection.DocumentLockModeChanged вызвать Veto.я его использую для override некоторых команд. Например для удаления, для Ctrl-C, Ctrl-V.
В самом Autodesk его используют. Они используют именно то, что я показывал на скриншотах.Подозреваю что всё что тебе хочется достигается комбинацией Autodesk.AutoCAD.EditorInput.CursorType, Autodesk.AutoCAD.EditorInput.UserInputControls и значений системных переменных DYNXXXX, выбором JigPrompts.AcquireDistance или JigPrompts.AcquirePoint. Ну и т.д.
Подозреваю что всё что тебе хочется достигается комбинацией Autodesk.AutoCAD.EditorInput.CursorType, Autodesk.AutoCAD.EditorInput.UserInputControls и значений системных переменных DYNXXXX, выбором JigPrompts.AcquireDistance или JigPrompts.AcquirePoint. Ну и т.д.
Но в итоге решение найдено.Отлично. Интересно бы взглянуть на видео как это работает.
Отлично. Интересно бы взглянуть на видео как это работает.ближе к выходным или на выходных выложу, ряд вопросов требует проработки