Событие подсветки ручки

Автор Тема: Событие подсветки ручки  (Прочитано 8881 раз)

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

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

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Событие подсветки ручки
« : 08-12-2015, 09:58:04 »
Не совсем уверен в правильности названия темы, и попробую пояснить картинкой
Вопрос, как отловить вот это событие?


искал события ручек, но таких событий вроде нет.
Как предположение, подписываться на изменение объекта и следить за Autodesk.AutoCAD.DatabaseServices.GripData.DrawType.HotGrip ?



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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #1 : 08-12-2015, 11:27:23 »
искал события ручек, но таких событий вроде нет.
Их действительно нет. Можешь попробовать поиграться с GripOverrule.
Как предположение, подписываться на изменение объекта и следить за Autodesk.AutoCAD.DatabaseServices.GripData.DrawType.HotGrip
Сам объект при появлении ручек не меняется.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Событие подсветки ручки
« Ответ #2 : 08-12-2015, 11:35:06 »
Может нужно начать с того - зачем это нужно? Добавить свой пункт или отменить показ меню. Может вы "свой" примитив делаете... Тогда и варианты поиска будут разными.
В любом случае - это ведь контекстное меню. Значит нужно "добраться" до этого контекстного меню. А само меню обычно имеет событие Popup

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Событие подсветки ручки
« Ответ #3 : 08-12-2015, 11:47:19 »
Может нужно начать с того - зачем это нужно?
для MPolygon в чистом Автокаде.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #4 : 08-12-2015, 11:48:38 »
В любом случае - это ведь контекстное меню. Значит нужно "добраться" до этого контекстного меню.
Если речь идёт о таком меню, то тогда нужно смотреть в сторону MultiModesGripPE. Пример использования: http://forums.autodesk.com/t5/objectarx/how-to-handle-ctrl-click-in-move-grip-point/m-p/3731264#M29749 (http://forums.autodesk.com/autodesk/attachments/autodesk/34/29749/1/DevDaysGripMenusSample.zip)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Событие подсветки ручки
« Ответ #5 : 08-12-2015, 12:46:52 »
Александр Ривилис, спасибо, вроде бы то что нужно. Буду разбираться.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #6 : 07-02-2018, 20:42:16 »
(http://forums.autodesk.com/autodesk/attachments/autodesk/34/29749/1/DevDaysGripMenusSample.zip)
Что-то у меня этот пример не хочет работать. Это только у меня так?

Отмечено как Решение Александр Ривилис 07-02-2018, 23:28:41

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #7 : 07-02-2018, 21:48:08 »
Вопрос снимается, разобрался. В исходниках почему-то оказались закомментированы строки с нужным функционалом. Если кому-то ещё надо будет, смотрите класс LowerLeftGrip, метод GetGripModes. Там нужно раскомментировать этот код:
Код - C# [Выбрать]
  1. foreach (GripMode m in Modes)
  2.     modes.Add(m);
  3. curMode = (uint)CurrentModeId;

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #8 : 07-02-2018, 22:28:25 »
Именно так. Я уже даже видео записал для AutoCAD 2018. Выложу, чтобы не пропадало месте с исходником:

Код - C# [Выбрать]
  1. // (C) Copyright 2010 by Microsoft
  2. //
  3. using System;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.GraphicsInterface;
  10. using System.Collections.Generic;
  11.  
  12.  
  13. namespace DevDaysGripMenusSample
  14. {
  15.  
  16.   public class TestOverrule
  17.   {
  18.     static DrawOverrule m_drawOverrule = new DrawOverrule();
  19.     static PropsOverrule m_propertiesOverrule = new PropsOverrule();
  20.     static XformOverrule m_xformOverrule = new XformOverrule();
  21.     static ObjectSnapOverrule m_osnapOverrule = new ObjectSnapOverrule();
  22.     static GripPointOverrule m_gripOverrule = new GripPointOverrule();
  23.     static HiliteOverrule m_hightlightOverrule = new HiliteOverrule();
  24.     static ObjOverrule m_objectOverrule = new ObjOverrule();
  25.     static Overrule[] m_overrules = new Overrule[]
  26.     {
  27.             m_drawOverrule,
  28.             m_propertiesOverrule,
  29.             m_xformOverrule,
  30.             m_osnapOverrule,
  31.             m_gripOverrule,
  32.             m_hightlightOverrule,
  33.             m_objectOverrule
  34.     };
  35.     static System.Collections.Generic.List<ObjectId> m_overruledObjects = new System.Collections.Generic.List<ObjectId>();
  36.     static readonly string RegAppName = "AsdkOverruleTest";
  37.     static bool m_overruleAdded = false;
  38.  
  39.     [CommandMethod("overrule")]
  40.     static public void Start()
  41.     {
  42.       Document doc = Application.DocumentManager.MdiActiveDocument;
  43.       Editor ed = doc.Editor;
  44.  
  45.       PromptEntityResult res = ed.GetEntity("Select a circle to overrule");
  46.       if (res.Status != PromptStatus.OK)
  47.         return;
  48.  
  49.       if (res.ObjectId.ObjectClass != RXObject.GetClass(typeof(Circle)))
  50.       {
  51.         ed.WriteMessage("Selected object is not a circle!\n");
  52.         return;
  53.       }
  54.  
  55.       if (m_overruledObjects.Count == 0)
  56.       {
  57.         Application.DocumentManager.DocumentToBeDestroyed += new DocumentCollectionEventHandler(DocumentManager_DocumentToBeDestroyed);
  58.       }
  59.       if (!m_overruledObjects.Contains(res.ObjectId))
  60.       {
  61.         Database db = res.ObjectId.Database;
  62.         using (Transaction t = db.TransactionManager.StartTransaction())
  63.         {
  64.           RegAppTable tbl = (RegAppTable)t.GetObject(db.RegAppTableId, OpenMode.ForRead, false);
  65.           if (!tbl.Has(RegAppName))
  66.           {
  67.             RegAppTableRecord app = new RegAppTableRecord();
  68.             app.Name = RegAppName;
  69.             tbl = (RegAppTable)t.GetObject(db.RegAppTableId, OpenMode.ForWrite, false);
  70.             tbl.Add(app);
  71.             t.AddNewlyCreatedDBObject(app, true);
  72.           }
  73.           Circle c = (Circle)t.GetObject(res.ObjectId, OpenMode.ForRead);
  74.  
  75.           if (c.GetXDataForApplication(RegAppName) == null)
  76.           {
  77.             c = (Circle)t.GetObject(res.ObjectId, OpenMode.ForWrite);
  78.             c.XData = new ResultBuffer(
  79.                 new TypedValue((int)DxfCode.ExtendedDataRegAppName, RegAppName),
  80.                 new TypedValue((int)DxfCode.ExtendedDataReal, Math.PI / 6) //start with 30 degrees
  81.             );
  82.             m_overruledObjects.Add(res.ObjectId);
  83.           }
  84.           t.Commit();
  85.         }
  86.       }
  87.       ObjectId[] ids = m_overruledObjects.ToArray();
  88.       foreach (Overrule o in m_overrules)
  89.       {
  90.         o.SetIdFilter(ids);
  91.  
  92.         if (!m_overruleAdded)
  93.           Overrule.AddOverrule(RXObject.GetClass(typeof(Circle)), o, false);
  94.       }
  95.  
  96.       m_overruleAdded = true;
  97.  
  98.       Application.DocumentManager.MdiActiveDocument.Editor.Regen();
  99.     }
  100.     static void End()
  101.     {
  102.       foreach (Overrule o in m_overrules)
  103.       {
  104.         Overrule.RemoveOverrule(RXObject.GetClass(typeof(Circle)), o);
  105.       }
  106.       Overrule.Overruling = false;
  107.       Application.DocumentManager.MdiActiveDocument.Editor.Regen();
  108.     }
  109.     static void DocumentManager_DocumentToBeDestroyed(object sender, DocumentCollectionEventArgs e)
  110.     {
  111.       //remove the ids that are going away
  112.       for (int i = m_overruledObjects.Count - 1; i >= 0; i--)
  113.         if (m_overruledObjects[i].Database == e.Document.Database)
  114.           m_overruledObjects.RemoveAt(i);
  115.       ObjectId[] ids = m_overruledObjects.ToArray();
  116.       foreach (Overrule o in m_overrules)
  117.         o.SetIdFilter(ids);
  118.     }
  119.     static double GetAngle(Circle c)
  120.     {
  121.       ResultBuffer rb = c.GetXDataForApplication(RegAppName);
  122.       return (double)rb.AsArray()[1].Value;
  123.     }
  124.     static LineSegment3d[] GetLines(Circle c)
  125.     {
  126.       LineSegment3d[] lines = new LineSegment3d[2];
  127.       double angle = GetAngle(c);
  128.       Point3d center = c.Center;
  129.       Vector3d normal = c.Normal;
  130.       Vector3d axis = normal.GetPerpendicularVector() * c.Radius;
  131.       Vector3d vec = axis.RotateBy(angle, normal);
  132.       lines[0] = new LineSegment3d(center - vec, center + vec);
  133.       vec = axis.RotateBy(-angle, normal);
  134.       lines[1] = new LineSegment3d(center - vec, center + vec);
  135.       return lines;
  136.     }
  137.     class DrawOverrule : DrawableOverrule
  138.     {
  139.       public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  140.       {
  141.         Circle c = (Circle)drawable;
  142.         LineSegment3d[] lines = GetLines(c);
  143.         foreach (LineSegment3d l in lines)
  144.           wd.Geometry.WorldLine(l.StartPoint, l.EndPoint);
  145.         return base.WorldDraw(drawable, wd);
  146.       }
  147.     }
  148.     class PropsOverrule : PropertiesOverrule
  149.     {
  150.       public override void List(Entity entity)
  151.       {
  152.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  153.         ed.WriteMessage("\tOverrule test\n");
  154.         ed.WriteMessage("\t\tAngle is {0}", GetAngle((Circle)entity));
  155.       }
  156.     }
  157.     class XformOverrule : TransformOverrule
  158.     {
  159.       public override void Explode(Entity entity, DBObjectCollection entitySet)
  160.       {
  161.         Circle c = (Circle)entity;
  162.         entitySet.Add((Circle)entity.Clone());
  163.         LineSegment3d[] lines = GetLines(c);
  164.         foreach (LineSegment3d l in lines)
  165.           entitySet.Add(new Line(l.StartPoint, l.EndPoint));
  166.       }
  167.     }
  168.  
  169.     class CircleMFMGPE : MultiModesGripPE
  170.     {
  171.       internal CircleMFMGPE(GripPointOverrule overrule)
  172.           : base()
  173.       {
  174.         m_overrule = overrule;
  175.       }
  176.       public override GripMode CurrentMode(Entity entity, GripData gripData)
  177.       {
  178.         if (gripData is GripPointOverrule.MyGrip)
  179.         {
  180.           int index = (int)((GripPointOverrule.MyGrip)gripData).CurrentModeId - (int)GripMode.ModeIdentifier.CustomStart;
  181.           return ((GripPointOverrule.MyGrip)gripData).Modes[index];
  182.         }
  183.         else
  184.           return null;
  185.       }
  186.       public override uint CurrentModeId(Entity entity, GripData gripData)
  187.       {
  188.         if (gripData is GripPointOverrule.MyGrip)
  189.           return (uint)(gripData as GripPointOverrule.MyGrip).CurrentModeId;
  190.         return 0;
  191.       }
  192.       public override bool GetGripModes(Entity entity, GripData gripData, GripModeCollection modes, ref uint curMode)
  193.       {
  194.         if (!(gripData is GripPointOverrule.MyGrip))
  195.           return false;
  196.         return (gripData as GripPointOverrule.MyGrip).GetGripModes(ref modes, ref curMode);
  197.       }
  198.       public override MultiModesGripPE.GripType GetGripType(Entity entity, GripData gripData)
  199.       {
  200.         return (gripData is GripPointOverrule.MyGrip) ? MultiModesGripPE.GripType.Secondary : MultiModesGripPE.GripType.Primary;
  201.       }
  202.       public override void Reset(Entity entity)
  203.       {
  204.       }
  205.       public override bool SetCurrentMode(Entity entity, GripData gripData, uint curMode)
  206.       {
  207.         if (!(gripData is GripPointOverrule.MyGrip))
  208.           return false;
  209.         (gripData as GripPointOverrule.MyGrip).CurrentModeId = (GripMode.ModeIdentifier)curMode;
  210.         return true;
  211.       }
  212.       private GripPointOverrule m_overrule;
  213.     }
  214.  
  215.     class GripPointOverrule : GripOverrule
  216.     {
  217.       CircleMFMGPE __theMFMGPE = null;
  218.       internal GripPointOverrule()
  219.       {
  220.         __theMFMGPE = new CircleMFMGPE(this);
  221.         RXObject.GetClass(typeof(Circle)).AddX(RXObject.GetClass(typeof(CircleMFMGPE)), __theMFMGPE);
  222.       }
  223.       internal abstract class MyGrip : GripData
  224.       {
  225.         protected MyGrip()
  226.         {
  227.           __modes = new GripModeCollection();
  228.         }
  229.         GripMode.ModeIdentifier __curModeId = GripMode.ModeIdentifier.CustomStart;
  230.         public virtual GripMode.ModeIdentifier CurrentModeId
  231.         {
  232.           get { return __curModeId; }
  233.           set { __curModeId = value; }
  234.         }
  235.         public GripModeCollection __modes;
  236.         public virtual GripModeCollection Modes
  237.         {
  238.           get { return __modes; }
  239.         }
  240.         public abstract void Move(Entity entity, Vector3d offset);
  241.         public abstract bool GetGripModes(ref GripModeCollection modes, ref uint curMode);
  242.         public override bool ViewportDraw(ViewportDraw vd, ObjectId entityId, GripData.DrawType type, Point3d? imageGripPoint, int gripSize)
  243.         {
  244.           Point2d unit = vd.Viewport.GetNumPixelsInUnitSquare(GripPoint);
  245.           vd.Geometry.Circle(GripPoint, gripSize / unit.X, vd.Viewport.ViewDirection);
  246.           return true;
  247.         }
  248.         protected void MoveWorker(Entity entity, Vector3d offset)
  249.         {
  250.           Circle c = (Circle)entity;
  251.           Point3d newGripPoint = GripPoint + offset;
  252.           c.Radius = newGripPoint.DistanceTo(c.Center);
  253.         }
  254.  
  255.       }
  256.  
  257.       public class RowGripMenuItem : Autodesk.AutoCAD.Runtime.IMenuItem
  258.       {
  259.         private GripData _Grip;
  260.         private Action _Action;
  261.  
  262.         private List<IMenuItem> _Items = new List<IMenuItem>();
  263.         public delegate void Action(GripData g, RowGripMenuItem r);
  264.  
  265.         public RowGripMenuItem(GripData g, Action a)
  266.         {
  267.           _Grip = g;
  268.           _Action = a;
  269.         }
  270.  
  271.         public bool Checked { get; set; }
  272.         public bool Enabled { get; set; }
  273.         public System.Drawing.Icon Icon { get; set; }
  274.         public string Text { get; set; }
  275.         public bool Visible { get; set; }
  276.  
  277.         public System.Collections.Generic.IEnumerable<Autodesk.AutoCAD.Runtime.IMenuItem> Items
  278.         {
  279.           get { return _Items; }
  280.         }
  281.  
  282.         public void OnClicked(System.EventArgs eventArgs)
  283.         {
  284.           if (_Action != null)
  285.             _Action.Invoke(_Grip, this);
  286.         }
  287.  
  288.         public void Add(IMenuItem m)
  289.         {
  290.           _Items.Add(m);
  291.         }
  292.  
  293.         public void Remove(IMenuItem m)
  294.         {
  295.           _Items.Remove(m);
  296.         }
  297.  
  298.         public event EventHandler Click;
  299.       }
  300.  
  301.       class LowerLeftGrip : MyGrip
  302.       {
  303.         public enum myMFMGPEModeId
  304.         {
  305.           kStretchRadiusX = GripMode.ModeIdentifier.CustomStart,
  306.           kStretchRadiusY,
  307.           kIncrementRadiusByOne
  308.         }
  309.  
  310.         public LowerLeftGrip()
  311.         {
  312.           GripMode m1 = new GripMode();
  313.           m1.ModeId = (uint)myMFMGPEModeId.kStretchRadiusX;
  314.           m1.DisplayString = "Stretch radius, offset mapped to X diection.";
  315.           m1.CLIPromptString = "\nSpecify new vertex point:";
  316.           m1.CLIKeywordList = "STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo _STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo";
  317.           m1.CLIDisplayString = "\n** STRETCH X **";
  318.           m1.Action = GripMode.ActionType.DragOn;
  319.           Modes.Add(m1);
  320.           GripMode m2 = new GripMode();
  321.           m2.ModeId = (uint)myMFMGPEModeId.kStretchRadiusY;
  322.           m2.DisplayString = "Stretch radius, offset mapped to Y diection.";
  323.           m2.CLIDisplayString = "\n** STRETCH Y **";
  324.           m1.CLIKeywordList = "STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo _STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo";
  325.           m2.CLIPromptString = "\nSpecify new vertex point:";
  326.           m2.Action = GripMode.ActionType.DragOn;
  327.           Modes.Add(m2);
  328.           GripMode m3 = new GripMode();
  329.           m3.ModeId = (uint)myMFMGPEModeId.kIncrementRadiusByOne;
  330.           m3.DisplayString = "Increment radius by 1.";
  331.           m3.CLIPromptString = "\nSpecify new vertex point:";
  332.           m3.CLIKeywordList = "STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo _STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo";
  333.           m3.CLIDisplayString = "\n** INCREMENT RADIUS BY 1 **";
  334.           m3.Action = GripMode.ActionType.Immediate;
  335.           Modes.Add(m3);
  336.           CurrentModeId = 0;
  337.         }
  338.         public override bool GetGripModes(ref GripModeCollection modes, ref uint curMode)
  339.         {
  340.           foreach (GripMode m in Modes)
  341.             modes.Add(m);
  342.           curMode = (uint)CurrentModeId;
  343.           return true;
  344.         }
  345.         public override void Move(Entity entity, Vector3d offset)
  346.         {
  347.           switch ((myMFMGPEModeId)CurrentModeId)
  348.           {
  349.             case myMFMGPEModeId.kStretchRadiusX:
  350.               offset = offset.Subtract(new Vector3d(0, offset.Y, 0));
  351.               break;
  352.             case myMFMGPEModeId.kStretchRadiusY:
  353.               offset = offset.Subtract(new Vector3d(offset.X, 0, 0));
  354.               break;
  355.             case myMFMGPEModeId.kIncrementRadiusByOne:
  356.               Vector3d v = GripPoint - ((Circle)entity).Center;
  357.               offset += v.GetNormal();
  358.               break;
  359.           }
  360.           MoveWorker(entity, offset);
  361.           return;
  362.         }
  363.  
  364.         public override IEnumerable<Autodesk.AutoCAD.Runtime.IMenuItem> OnRightClick(GripDataCollection hotGrips, ObjectIdCollection entities)
  365.         {
  366.           List<RowGripMenuItem> GripMenu = new List<RowGripMenuItem>();
  367.  
  368.           GripMenu.Add(
  369.            new RowGripMenuItem(this, null)
  370.            {
  371.              Text = "Test-1",
  372.              Icon = Resource1.MyTestIcon
  373.            }
  374.           );
  375.  
  376.           GripMenu.Add(
  377.            new RowGripMenuItem(this, null)
  378.            {
  379.              Text = "Test - 2",
  380.              Icon = Resource1.MyTestIcon
  381.            }
  382.          );
  383.  
  384.           return GripMenu;
  385.         }
  386.       }
  387.       class UpperRightGrip : MyGrip
  388.       {
  389.         public override bool GetGripModes(ref GripModeCollection modes, ref uint curMode)
  390.         {
  391.           GripMode m1 = new GripMode();
  392.           m1.ModeId = 0;
  393.           m1.DisplayString = "Upper right not implemeted";
  394.           m1.Action = GripMode.ActionType.Immediate;
  395.           modes.Add(m1);
  396.           curMode = 0;
  397.  
  398.           return true;
  399.         }
  400.  
  401.         public override void Move(Entity entity, Vector3d offset)
  402.         {
  403.           MoveWorker(entity, offset);
  404.         }
  405.       }
  406.       class UpperLeftGrip : MyGrip
  407.       {
  408.         public override bool GetGripModes(ref GripModeCollection modes, ref uint curMode)
  409.         {
  410.           GripMode m1 = new GripMode();
  411.           m1.ModeId = 0;
  412.           m1.DisplayString = "Upper left not implemeted";
  413.           m1.Action = GripMode.ActionType.Immediate;
  414.           modes.Add(m1);
  415.           curMode = 0;
  416.  
  417.           return true;
  418.         }
  419.         public override void Move(Entity entity, Vector3d offset)
  420.         {
  421.           MoveWorker(entity, offset);
  422.         }
  423.       }
  424.       class LowerRightGrip : MyGrip
  425.       {
  426.         public override bool GetGripModes(ref GripModeCollection modes, ref uint curMode)
  427.         {
  428.           GripMode m1 = new GripMode();
  429.           m1.ModeId = 0;
  430.           m1.DisplayString = "Lower right not implemeted";
  431.           m1.Action = GripMode.ActionType.Immediate;
  432.           modes.Add(m1);
  433.           curMode = 0;
  434.  
  435.           return true;
  436.         }
  437.         public override void Move(Entity entity, Vector3d offset)
  438.         {
  439.           MoveWorker(entity, offset);
  440.         }
  441.       }
  442.       GripData[] m_grips = new GripData[4];
  443.       public override void GetGripPoints(Entity entity, GripDataCollection grips, double curViewUnitSize, int gripSize, Vector3d curViewDir, Autodesk.AutoCAD.DatabaseServices.GetGripPointsFlags bitFlags)
  444.       {
  445.         base.GetGripPoints(entity, grips, curViewUnitSize, gripSize, curViewDir, bitFlags);
  446.  
  447.         Circle c = (Circle)entity;
  448.         LineSegment3d[] lines = GetLines(c);
  449.         m_grips[0] = new LowerLeftGrip();
  450.         m_grips[0].GripPoint = lines[0].StartPoint;
  451.         m_grips[1] = new UpperRightGrip();
  452.         m_grips[1].GripPoint = lines[0].EndPoint;
  453.         m_grips[2] = new UpperLeftGrip();
  454.         m_grips[2].GripPoint = lines[1].StartPoint;
  455.         m_grips[3] = new LowerRightGrip();
  456.         m_grips[3].GripPoint = lines[1].EndPoint;
  457.         foreach (GripData g in m_grips)
  458.           grips.Add(g);
  459.       }
  460.       public override void MoveGripPointsAt(Entity entity, GripDataCollection grips, Vector3d offset, Autodesk.AutoCAD.DatabaseServices.MoveGripPointsFlags bitFlags)
  461.       {
  462.         foreach (GripData grip in grips)
  463.         {
  464.           MyGrip myGrip = grip as MyGrip;
  465.           if (myGrip != null)
  466.             myGrip.Move(entity, offset);
  467.           else
  468.             base.MoveGripPointsAt(entity, grips, offset, bitFlags);
  469.         }
  470.       }
  471.     }
  472.     class ObjectSnapOverrule : OsnapOverrule
  473.     {
  474.       public override void GetObjectSnapPoints(Entity entity, ObjectSnapModes snapMode, IntPtr gsSelectionMark, Point3d pickPoint, Point3d lastPoint, Matrix3d viewTransform, Point3dCollection snapPoints, IntegerCollection geometryIds)
  475.       {
  476.         base.GetObjectSnapPoints(entity, snapMode, gsSelectionMark, pickPoint, lastPoint, viewTransform, snapPoints, geometryIds);
  477.         if ((snapMode & ObjectSnapModes.ModeEnd) == ObjectSnapModes.ModeEnd)
  478.         {
  479.           Circle c = (Circle)entity;
  480.           LineSegment3d[] lines = GetLines(c);
  481.           foreach (LineSegment3d l in lines)
  482.           {
  483.             snapPoints.Add(l.StartPoint);
  484.             snapPoints.Add(l.EndPoint);
  485.           }
  486.         }
  487.       }
  488.     }
  489.  
  490.     class HiliteOverrule : HighlightOverrule
  491.     {
  492.       public override void Highlight(Entity entity, FullSubentityPath subId, bool highlightAll)
  493.       {
  494.         base.Highlight(entity, subId, highlightAll);
  495.       }
  496.       public override void Unhighlight(Entity entity, FullSubentityPath subId, bool highlightAll)
  497.       {
  498.         base.Unhighlight(entity, subId, highlightAll);
  499.       }
  500.     }
  501.  
  502.     class ObjOverrule : ObjectOverrule
  503.     {
  504.       public override void Erase(DBObject dbObject, bool erasing)
  505.       {
  506.         //prevent the object from being deleted
  507.         base.Erase(dbObject, erasing);
  508.         if (erasing)
  509.           throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.CannotBeErasedByCaller);
  510.       }
  511.     }
  512.   }
  513. }

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #9 : 09-02-2018, 18:04:17 »
По этому демонстрационному проекту можно писать пособие "Как НЕ надо писать приложения на C#" - материала хоть отбавляй. Но это ладно, ему уже лет 10, если не больше. Возможно, в те времена это было в порядке вещей.
Но мне непонятен такой момент - почему при отключении OsnapOverrule (комментирую строки 6 и 15) перестаёт корректно работать вариант с увеличением радиуса на 1? Получается, что он работает только за счёт того, что срабатывает привязка? Какое-то очень странное поведение.
Код - C# [Выбрать]
  1. public class TestOverrule
  2. {
  3.     static DrawOverrule m_drawOverrule = new DrawOverrule();
  4.     static PropsOverrule m_propertiesOverrule = new PropsOverrule();
  5.     static XformOverrule m_xformOverrule = new XformOverrule();
  6.     //static ObjectSnapOverrule m_osnapOverrule = new ObjectSnapOverrule();
  7.     static GripPointOverrule m_gripOverrule = new GripPointOverrule();
  8.     static HiliteOverrule m_hightlightOverrule = new HiliteOverrule();
  9.     static ObjOverrule m_objectOverrule = new ObjOverrule();
  10.     static Overrule[] m_overrules = new Overrule[]
  11.     {
  12.         m_drawOverrule,
  13.         m_propertiesOverrule,
  14.         m_xformOverrule,
  15.         //m_osnapOverrule,
  16.         m_gripOverrule,
  17.         m_hightlightOverrule,
  18.         m_objectOverrule
  19.     };
  20.     static System.Collections.Generic.List<ObjectId> m_overruledObjects = new System.Collections.Generic.List<ObjectId>();
  21.     static readonly string RegAppName = "AsdkOverruleTest";
  22.     static bool m_overruleAdded = false;
  23.  
  24.     [CommandMethod("overrule")]
  25.     static public void Start()
  26.     {
  27.         Document doc = Application.DocumentManager.MdiActiveDocument;
  28.         Editor ed = doc.Editor;
  29.  
  30.  

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #10 : 09-02-2018, 19:17:07 »
Причём, чтобы увидеть эту некорректность работы, должны быть настройки привязки "по умолчанию". Если объектная привязка выключена или включены все режимы привязки - проблем нет. Для того, чтобы увидеть проблему, надо включить эти режимы:

Как это выглядит:

То есть, вместо увеличения на 1, радиус становится 1.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #11 : 09-02-2018, 19:53:16 »
Очень интересный фортель. Если привязка Центр включена и нет ObjectSnapOverrule, которая эту привязку "перешибает", то в метод Move приходит offset не {(0,0,0)}, а смещение от центра круга и это всё сбивает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #12 : 09-02-2018, 19:56:32 »
Вот оно в чём дело - привязка "Центр"! У нас курсор находится на окружности, а так как эта привязка включена, то ручку утягивает в центр. Теперь хотя бы понятна причина поведения, спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #13 : 09-02-2018, 19:58:59 »
Ну и (IMHO) самый простой способ это обойти:
Код - C# [Выбрать]
  1. public override void Move(Entity entity, Vector3d offset)
  2. {
  3.   switch ((myMFMGPEModeId)CurrentModeId)
  4.   {
  5.     case myMFMGPEModeId.kStretchRadiusX:
  6.       offset = offset.Subtract(new Vector3d(0, offset.Y, 0));
  7.       MoveWorker(entity, offset);
  8.       break;
  9.     case myMFMGPEModeId.kStretchRadiusY:
  10.       offset = offset.Subtract(new Vector3d(offset.X, 0, 0));
  11.       MoveWorker(entity, offset);
  12.       break;
  13.     case myMFMGPEModeId.kIncrementRadiusByOne:
  14.       ((Circle)entity).Radius += 1.0;
  15.       break;
  16.   }
  17.  
  18.   return;
  19. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #14 : 09-02-2018, 20:07:49 »
Да, это сработало! Спасибо! Буду дальше разбирать эти авгиевы конюшни :) Удаляю, разделяю, исправляю, упрощаю... Я так думаю, что когда закончу, можно будет выложить результат здесь.
Вот например этот же самый метод Move: вот какой смысл в return в конце метода? :)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #15 : 12-02-2018, 11:51:01 »
Почти закончил своё исследование этого механизма. Остался последний непонятный момент - как работает свойство GripMode.CLIKeywordList? В коде ему задаётся куча доступных для использования ключевых слов, но нигде не описываются действия, которые выполняются при их выборе. Предполагается, что это все возможные ключевые слова и для них уже есть стандартные действия? Т.е. можно оставить только нужные? Но откуда тогда взят это список "предустановленных" слов?
Код - C# [Выбрать]
  1. m1.CLIKeywordList = "STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo _STretch MOve ROtate SCale MIrror Base Copy Undo X EXit dummy GMove CGizmo";

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #16 : 12-02-2018, 12:14:55 »
Думаю, что это более-менее универсальный набор ключевых слов для английской версии AutoCAD при выборе стандартных ручек.
Проверить можно так. В ARXDBG включаем Reactors...:

Рисуем КРУГ, выбираем одну из ручек и видим в командной строке перечень ключевых слов:



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #17 : 12-02-2018, 12:22:32 »
Супер! Спасибо!

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #18 : 12-02-2018, 12:36:13 »
А в английской версии работает ключевое слово "Undo" для ручки окружности? Просто у меня в русском Civil 3D перекидывает на "Базовая точка" ("Base") при выборе "ОТменить" ("Undo"):

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #19 : 12-02-2018, 14:02:28 »
Хотя, по большому счёту, это не так важно. Код работает как надо, а некорректность поведения ручек проявляется и для стандартных ручек. Поэтому, считаю своё исследование законченным и выкладываю результат (проект в VS 2017)
« Последнее редактирование: 12-02-2018, 16:55:39 от Дмитрий Загорулькин »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #20 : 12-02-2018, 14:03:12 »
В английской версии:

P.S.: В русской, но чистый AutoCAD тоже работает корректно:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #21 : 12-02-2018, 14:12:21 »
Ха! А Вы хитрец! :)
Если через контекстное меню - то у меня работает так же как у Вас. А если ввести ключевое слово или выбрать его в списке динамического ввода или в комстроке по нему щёлкнуть мышкой - то так как на моём видео.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие подсветки ручки
« Ответ #22 : 12-02-2018, 14:47:07 »
Если через контекстное меню - то у меня работает так же как у Вас. А если ввести ключевое слово или выбрать его в списке динамического ввода или в комстроке по нему щёлкнуть мышкой - то так как на моём видео.
Да. В русской версии действительно работает только с _U, но не ОТ, т.к. ОТ ключевое слово при вводе координат точки. Зря конечно они его использовали. Нужно было что-то типа ОТМ взять для отмены.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие подсветки ручки
« Ответ #23 : 12-02-2018, 16:56:37 »
Нужно было что-то типа ОТМ взять для отмены.
Исправил в своём примере - действительно, ОТМ работает как надо. Перезалил архив.