Переопределение ручек .NET

Автор Тема: Переопределение ручек .NET  (Прочитано 4479 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 358
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Переопределение ручек .NET
« : 25-06-2016, 17:38:00 »
Переопределяю стандартные ручки отрезка и добавляю дополнительную, на которую вешаю свои команды. Только вот эта ручка остается стандартной для перемещения, а мне нужна для изменения вида и, как следствие после выбора моей команды, запрашивается новое положение. Как можно изменить тип дополнительной ручки, чтобы она не запрашивала нового положения?
Смотрел в OnHotGrip, пробовал различные значения ReturnValue, но никакого эффекта это не дало.

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

  • Administrator
  • *****
  • Сообщений: 12984
  • Карма: 1669
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Переопределение ручек .NET
« Ответ #1 : 25-06-2016, 19:22:33 »
Где код?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 358
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Переопределение ручек .NET
« Ответ #2 : 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.  

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

  • Administrator
  • *****
  • Сообщений: 12984
  • Карма: 1669
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Переопределение ручек .NET
« Ответ #3 : 25-06-2016, 19:57:12 »
Ничего из этого кода не понял. Т.е. из меню хочешь запускать команду? Тогда следует использовать MultiModesGripPE и GripMode.ActionType == Command
Пример использования MultiModesGripPE здесь: http://forums.autodesk.com/autodesk/attachments/autodesk/34/29749/1/DevDaysGripMenusSample.zip
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 358
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Переопределение ручек .NET
« Ответ #4 : 25-06-2016, 20:00:20 »
Ничего из этого кода не понял. Т.е. из меню хочешь запускать команду?
Нет - я хочу создавать статичные ручки, которые не требуют указания нового положения, когда на них наживаешь.

Вроде это именно то, что мне нужно. Завтра посмотрю и отпишусь.
Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 12984
  • Карма: 1669
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Переопределение ручек .NET
« Ответ #5 : 25-06-2016, 20:05:53 »
Тут еще один пример: https://forums.autodesk.com/t5/net/gripdata-onhover-how-to-add-a-context-menu/m-p/5667518#M44869
Нет - я хочу создавать статичные ручки
Статичные? Ну и термин у тебя. Это значит, что они никак не привязаны к положению примитива? Т.е. отрезок удлинили, а твоя ручка осталась на месте?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 358
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Переопределение ручек .NET
« Ответ #6 : 25-06-2016, 20:14:33 »
Статичные? Ну и термин у тебя. Это значит, что они никак не привязаны к положению примитива? Т.е. отрезок удлинили, а твоя ручка осталась на месте?
Нет, как раз она должна быть привязана к примитиву, это не проблема.
Все дополнительные ручки, которые я добавляю к примитиву, когда я на них нажимаю, требуют указать их новое местоположение. А мне надо, чтобы я на нее нажал, выполнилась моя команда и все. Такое же поведение, как у ручки видимости.

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

  • Administrator
  • *****
  • Сообщений: 12984
  • Карма: 1669
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Переопределение ручек .NET
« Ответ #7 : 25-06-2016, 20:15:45 »
Такое же поведение, как у ручки видимости.
Ну тогда я дал тебе правильную наводку на MultiModesGripPE.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 29-06-2016, 14:05:22

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2457
  • Карма: 692
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: Переопределение ручек .NET
« Ответ #8 : 26-06-2016, 23:15:12 »
Вместо 53 строчки попробуй:
Код - C# [Выбрать]
  1. return ReturnValue.GripHotToWarm;

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 358
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Переопределение ручек .NET
« Ответ #9 : 27-06-2016, 14:46:39 »
Вместо 53 строчки попробуй:
Код - C# [Выбрать]
return ReturnValue.GripHotToWarm;
Работает! :) Только потребовалось заблокировать документ:
Код - C# [Выбрать]
  1. using(DocumentLock lk = doc.LockDocument())