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

ADN Club => AutoCAD .NET API => Тема начата: bargool от 30-07-2014, 14:44:10

Название: DrawJig из палитры и ком. строка
Отправлено: bargool от 30-07-2014, 14:44:10
Как сбросить приглашение ком. строки после запуска DrawJig из палитры?
По нажатию кнопки на палитре запускается метод со вставкой примитивов с помощью DrawJig. При этом в ком. строке появляется приглашение. После окончания работы метода приглашение так и висит в ком. строке, от чего хотелось бы избавиться
Видео проблемы (https://screencast.autodesk.com/main/details/fc962303-30f3-43c1-b71b-b740c9d8bc78)
Класс-наследник DrawJig:
Код - C# [Выбрать]
  1. class InsertJigger : DrawJig
  2. {
  3.     Point3d startPoint;
  4.     IEnumerable<Entity> entities;
  5.     Point3d insertPoint;
  6.  
  7.     private readonly Matrix3d currentUCS;
  8.     private readonly Tolerance tolerance = new Tolerance(0.0001, 0.0001);
  9.  
  10.     public InsertJigger(Point3d startPoint, IEnumerable<Entity> ents)
  11.     {
  12.         this.currentUCS = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
  13.         this.startPoint = startPoint.TransformBy(currentUCS);
  14.         this.entities = ents;
  15.         this.insertPoint = Point3d.Origin;
  16.     }
  17.  
  18.     protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  19.     {
  20.         Matrix3d mat = Matrix3d.Displacement(this.startPoint.GetVectorTo(this.insertPoint));
  21.  
  22.         mat = currentUCS.PreMultiplyBy(mat);
  23.  
  24.         WorldGeometry geo = draw.Geometry;
  25.         if (geo != null)
  26.         {
  27.             geo.PushModelTransform(mat);
  28.             foreach (var ent in this.entities)
  29.                 geo.Draw(ent);
  30.  
  31.             geo.PopModelTransform();
  32.         }
  33.  
  34.         return true;
  35.     }
  36.  
  37.     protected override SamplerStatus Sampler(JigPrompts prompts)
  38.     {
  39.         JigPromptPointOptions jppo = new JigPromptPointOptions("\nУкажите точку вставки изображения:");
  40.         jppo.UserInputControls = UserInputControls.GovernedByUCSDetect | UserInputControls.Accept3dCoordinates;
  41.  
  42.         PromptPointResult res = prompts.AcquirePoint(jppo);
  43.  
  44.         if (res.Status != PromptStatus.OK)
  45.             return SamplerStatus.Cancel;
  46.  
  47.         if (res.Value.IsEqualTo(this.insertPoint, tolerance))
  48.             return SamplerStatus.NoChange;
  49.  
  50.         this.insertPoint = res.Value;
  51.  
  52.         return SamplerStatus.OK;
  53.     }
  54.  
  55.     private void TransformEntities()
  56.     {
  57.         Matrix3d mat = Matrix3d.Displacement(this.startPoint.GetVectorTo(insertPoint));
  58.         mat = currentUCS.PreMultiplyBy(mat);
  59.         foreach (Entity ent in this.entities)
  60.             ent.TransformBy(mat);
  61.     }
  62.  
  63.     public static PromptResult Jig(IEnumerable<Entity> ents)
  64.     {
  65.         Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  66.         InsertJigger jigger = new InsertJigger(Point3d.Origin, ents);
  67.         PromptResult res = ed.Drag(jigger);
  68.         if (res.Status == PromptStatus.OK)
  69.             jigger.TransformEntities();
  70.  
  71.         return res;
  72.     }
  73. }
На входе только что созданные и добавленные в транзакцию и т.д. примитивы
Забыл добавить: Autocad 2014

Конечно, остается ещё вариант добавить в конце WriteMessage("\nУсё готово\n")
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Александр Ривилис от 30-07-2014, 18:56:24
Попробуй после завершения Jig вызвать Editor.PostCommandPrompt
Название: Re: DrawJig из палитры и ком. строка
Отправлено: bargool от 31-07-2014, 09:44:56
Александр Наумович, спасибо! Работает.
Название: Re: DrawJig из палитры и ком. строка
Отправлено: bargool от 31-07-2014, 12:20:54
Нда, там всё веселее оказалось. У меня после вставки изображения регистрируется PointMonitor, который показывает служебную информацию в ToolTip'ах.
Так вот, пока не кликнешь в окно документа, эти тултипы показываться не начинали.
Причём если после вставки кликнуть - начнут показваться, потом опять вставить изображение - перестают показываться.
Решил МЕГА-Костылём. Сделал пустую команду
Код - C# [Выбрать]
  1. [CommandMethod("DummyCommand")]
  2. public void DummyCommand()
  3. { }
А после вставки изображения в чертёж вызываю
Код - C# [Выбрать]
  1. dwg.SendStringToExecute("DummyCommand ", true, false, false);
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Дима_ от 31-07-2014, 12:46:59
Решил МЕГА-Костылём. Сделал пустую команду
Блестяще!!
http://www.youtube.com/watch?v=CQ1xGJW1Yx4 (http://www.youtube.com/watch?v=CQ1xGJW1Yx4)
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Александр Ривилис от 31-07-2014, 19:15:29
Я бы сделал совсем иначе. Тот код, который выполняется у тебя из палитры, я бы оформил в виде команды, которую и запускал бы.
Название: Re: DrawJig из палитры и ком. строка
Отправлено: bargool от 31-07-2014, 23:29:36
Блестяще!!
http://www.youtube.com/watch?v=CQ1xGJW1Yx4 (http://www.youtube.com/watch?v=CQ1xGJW1Yx4)
Ага, именно так, как озаглавлен этот ролик
Я бы сделал совсем иначе. Тот код, который выполняется у тебя из палитры, я бы оформил в виде команды, которую и запускал бы.
Да, в идеале стоит сам процесс вставки вынести в команду. Просто здесь я пошел по пути наименьшего сопротивления =)
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Дмитрий Загорулькин от 01-08-2014, 13:09:43
Я бы сделал совсем иначе. Тот код, который выполняется у тебя из палитры, я бы оформил в виде команды, которую и запускал бы.
Непонятно только, почему нужно так делать? Я использую EntityJig для вставки блоков с использованием палитры - такой проблемы нет. Команд и дополнительных команд не использую - только метод отклика на щелчок по элементу списка в контроле палитры.
https://screencast.autodesk.com/main/details/88e3bbbd-29d8-45f2-b74d-a68f8bfe34e5
DrawJig как-то по другому себя ведет?
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Александр Ривилис от 01-08-2014, 19:12:04
Непонятно только, почему нужно так делать?
Палитра работает в контексте приложения, а команду можно запустить в контексте документа. С контекстом приложения работать сложнее. Не говоря уже о необходимости блокировки документа, еще частенько бывают проблемы с переключением фокуса между палитрой и окном документа. И всё это еще и зависит от версий AutoCAD. Поэтому если можно реализовать в виде запуска команды, то (IMHO) это проще и надежней.
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Дмитрий Загорулькин от 27-08-2014, 11:56:12
Непонятно только, почему нужно так делать? Я использую EntityJig для вставки блоков с использованием палитры - такой проблемы нет.
Был неправ. Сегодня нашел в неожиданном месте своего кода вот такую строчку:
ed.WriteMessage("\n");
Похоже, что у меня тоже была такая проблема и я ее вот таким вот образом обошел :)
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Дмитрий Загорулькин от 01-09-2014, 19:29:03
Попробуй после завершения Jig вызвать Editor.PostCommandPrompt
Еще вот такой вариант сегодня нашел: Autodesk.AutoCAD.Internal.Utils.PostCommandPrompt();
Интересно, чем отличается? В документации ничего нет про Autodesk.AutoCAD.Internal :(
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Александр Ривилис от 01-09-2014, 20:06:37
В документации ничего нет про Autodesk.AutoCAD.Internal
Ну не зря оно Internal (т.е. для внутреннего потребления Autodesk'овцами). Думаю что эти методы эквивалентны, но сначала появился Autodesk.AutoCAD.Internal.Utils.PostCommandPrompt, а в очередной версии AutoCAD появился  Editor.PostCommandPrompt.
И то и другое - это обертки для acedPostCommandPrompt из ObjectARX.
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Дмитрий Загорулькин от 18-11-2016, 19:54:36
Я бы сделал совсем иначе. Тот код, который выполняется у тебя из палитры, я бы оформил в виде команды, которую и запускал бы.
Попробовал этот совет воплотить в жизнь и столкнулся со следующим поведением. Команда, отправленная из палитры с помощью Document.SendStringToExecute отрабатывает только тогда, когда курсор из палитры переводится на чертеж. Как считаете, можно сделать так, чтобы сразу отрабатывала?
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Александр Ривилис от 18-11-2016, 20:39:28
Не помогает, если до запуска команды:
Код - C# [Выбрать]
  1.  Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
?
Название: Re: DrawJig из палитры и ком. строка
Отправлено: Дмитрий Загорулькин от 18-11-2016, 20:50:03
Эх... Все оказалось проще - надо третий параметр (wrapUpInactiveDoc) задать как false. Зачем я его в true выставил?  ??? Пора на отдых. :)