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

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 25-06-2016, 17:38:00

Название: Переопределение ручек .NET
Отправлено: Алексей Терно от 25-06-2016, 17:38:00
Переопределяю стандартные ручки отрезка и добавляю дополнительную, на которую вешаю свои команды. Только вот эта ручка остается стандартной для перемещения, а мне нужна для изменения вида и, как следствие после выбора моей команды, запрашивается новое положение. Как можно изменить тип дополнительной ручки, чтобы она не запрашивала нового положения?
Смотрел в OnHotGrip, пробовал различные значения ReturnValue, но никакого эффекта это не дало.
Название: Re: Переопределение ручек .NET
Отправлено: Александр Ривилис от 25-06-2016, 19:22:33
Где код?
Название: Re: Переопределение ручек .NET
Отправлено: Алексей Терно от 25-06-2016, 19:54:41
Вот, например:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Runtime;
  6.  
  7. namespace testspds
  8. {
  9.     public class MyClass
  10.     {
  11.         [CommandMethod("mylinegrip")]
  12.         public void mylinegrip()
  13.         {
  14.             ObjectOverrule.AddOverrule(RXClass.GetClass(typeof(Line)), MyLineGripOverruleClass.Instance, true);
  15.  
  16.             Document doc = Application.DocumentManager.MdiActiveDocument;
  17.             doc.Editor.Regen();
  18.         }
  19.     }
  20.  
  21.     public class MyLineGripOverruleClass : GripOverrule
  22.     {
  23.         public static MyLineGripOverruleClass Instance = new MyLineGripOverruleClass();
  24.  
  25.         public override void GetGripPoints(Entity entity, GripDataCollection grips, double curViewUnitSize, int gripSize, Vector3d curViewDir, GetGripPointsFlags bitFlags)
  26.         {
  27.             Line line = (Line)entity;
  28.  
  29.             MyLineGripClass gd = new MyLineGripClass();
  30.             gd.GripPoint = new Point3d(line.EndPoint.X + line.Length / 10, line.EndPoint.Y, 0);
  31.             grips.Add(gd);
  32.  
  33.             base.GetGripPoints(entity, grips, curViewUnitSize, gripSize, curViewDir, bitFlags);
  34.         }
  35.     }
  36.  
  37.     public class MyLineGripClass : GripData
  38.     {
  39.         public override ReturnValue OnHotGrip(ObjectId entityId, Context contextFlags)
  40.         {
  41.             Line line;
  42.  
  43.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  44.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  45.  
  46.             using (Transaction trans = db.TransactionManager.StartTransaction())
  47.             {
  48.                 line = (Line)entityId.GetObject(OpenMode.ForRead);
  49.                 ed.WriteMessage("\n" + line.Length.ToString("0.000"));
  50.                 trans.Abort();
  51.             }
  52.  
  53.             return base.OnHotGrip(entityId, contextFlags);
  54.         }
  55.     }
  56.  
  57. }
  58.  
Название: Re: Переопределение ручек .NET
Отправлено: Александр Ривилис от 25-06-2016, 19:57:12
Ничего из этого кода не понял. Т.е. из меню хочешь запускать команду? Тогда следует использовать MultiModesGripPE и GripMode.ActionType == Command
Пример использования MultiModesGripPE здесь: http://forums.autodesk.com/autodesk/attachments/autodesk/34/29749/1/DevDaysGripMenusSample.zip
Название: Re: Переопределение ручек .NET
Отправлено: Алексей Терно от 25-06-2016, 20:00:20
Ничего из этого кода не понял. Т.е. из меню хочешь запускать команду?
Нет - я хочу создавать статичные ручки, которые не требуют указания нового положения, когда на них наживаешь.

Вроде это именно то, что мне нужно. Завтра посмотрю и отпишусь.
Спасибо!
Название: Re: Переопределение ручек .NET
Отправлено: Александр Ривилис от 25-06-2016, 20:05:53
Тут еще один пример: https://forums.autodesk.com/t5/net/gripdata-onhover-how-to-add-a-context-menu/m-p/5667518#M44869
Нет - я хочу создавать статичные ручки
Статичные? Ну и термин у тебя. Это значит, что они никак не привязаны к положению примитива? Т.е. отрезок удлинили, а твоя ручка осталась на месте?
Название: Re: Переопределение ручек .NET
Отправлено: Алексей Терно от 25-06-2016, 20:14:33
Статичные? Ну и термин у тебя. Это значит, что они никак не привязаны к положению примитива? Т.е. отрезок удлинили, а твоя ручка осталась на месте?
Нет, как раз она должна быть привязана к примитиву, это не проблема.
Все дополнительные ручки, которые я добавляю к примитиву, когда я на них нажимаю, требуют указать их новое местоположение. А мне надо, чтобы я на нее нажал, выполнилась моя команда и все. Такое же поведение, как у ручки видимости.
Название: Re: Переопределение ручек .NET
Отправлено: Александр Ривилис от 25-06-2016, 20:15:45
Такое же поведение, как у ручки видимости.
Ну тогда я дал тебе правильную наводку на MultiModesGripPE.
Название: Re: Переопределение ручек .NET
Отправлено: Дмитрий Загорулькин от 26-06-2016, 23:15:12
Вместо 53 строчки попробуй:
Код - C# [Выбрать]
  1. return ReturnValue.GripHotToWarm;
Название: Re: Переопределение ручек .NET
Отправлено: Алексей Терно от 27-06-2016, 14:46:39
Вместо 53 строчки попробуй:
Код - C# [Выбрать]
return ReturnValue.GripHotToWarm;
Работает! :) Только потребовалось заблокировать документ:
Код - C# [Выбрать]
  1. using(DocumentLock lk = doc.LockDocument())